I have two tables that I'd like do a full outer join where the resulting view separates the values table into two separate columns with one row for each name_id. I have made one approach with a CASE expression to select by type and then use it with pandas to fill in the values and return distinct name_ids.
Name Table
| name_id | name |
|---|---|
| 1 | foo |
| 2 | bar |
| 3 | doo |
| 4 | sue |
Values Table
| name_id | value | type |
|---|---|---|
| 1 | 90 | red |
| 2 | 95 | blue |
| 3 | 33 | red |
| 3 | 35 | blue |
| 4 | 60 | blue |
| 4 | 20 | red |
This is a condensed version. In my full table, I need to do this twice with two separate value tables sorted by type, red/blue and control/placebo.
Simple Join
SELECT names_table.name_id, name, value, type
FULL OUTER JOIN values_table
ON names_table.name_id = values_table.name_id
WHERE type in ('red', 'blue')
| name_id | name | value | type |
|---|---|---|---|
| 1 | foo | 90 | red |
| 2 | bar | 95 | blue |
| 3 | doo | 33 | red |
| 3 | doo | 35 | blue |
| 4 | sue | 60 | blue |
| 4 | sue | 20 | red |
Current work around result which I then fix with python and pandas
SELECT names_table.name_id, name, value, type
CASE
WHEN type = 'red' THEN value END red,
CASE
WHEN type = 'blue' THEN value END blue
FROM names_table
FULL OUTER JOIN values_table
ON names_table.name_id = values_table.name_id
| name_id | name | blue | red |
|---|---|---|---|
| 1 | foo | Null | 90 |
| 2 | bar | 95 | Null |
| 3 | doo | 35 | Null |
| 3 | doo | Null | 33 |
| 4 | sue | 60 | Null |
| 4 | sue | Null | 20 |
This is my desired output below, where I would have the types as columns and just rows for unique name_ids but with value tables 1 and 2.
Desired Output
| name_id | name | blue | red |
|---|---|---|---|
| 1 | foo | Null | 90 |
| 2 | bar | 95 | Null |
| 3 | doo | 35 | 33 |
| 4 | sue | 60 | 20 |