I am having issues with a join and I was hoping to get some help. I have one table (table A) that is structured like so:
| Fruit | SKU |
|---|---|
| Apple | 001 |
| Apple | X01 |
| Apple | B01 |
| Banana | 002 |
| Banana | X02 |
| Banana | B01 |
| Orange | 003 |
| Orange | B03 |
For each fruit, there is a SKU that corresponds to the numbering system used in a year. There are 100s of fruits.
There is another table (Table 2) that looks like this:
| SKU_2018 | SKU_2017 | SKU_2016 |
|---|---|---|
| 001 | X01 | B01 |
| 002 | X02 | X03 |
There are different SKU formats for each year between 1990 – 2020. There are no overlapping SKUs, all values are unique. However, I want to map all SKUs to one common year (2018):
What I would like is a table (Table 3) that looks like:
| Fruit | SKU | SKU_2018 |
|---|---|---|
| Apple | 001 | 001 |
| Apple | X01 | 001 |
| Apple | B01 | 001 |
| Banana | 002 | 002 |
| Banana | X02 | 002 |
| Banana | B01 | 002 |
| Orange | 003 | 003 |
| Orange | B03 | 003 |
My code looks like:
select a.fruit, a.sku, b.sku2018 from tableA a left join tableB b on a.sku = coalesce(b.sku_2018, b.sku_2017, b.sku_2016, so and so for each year)
however, these are returning some NULLs even when there are SKUs that match. I cannot figure out why! I hope that is clear enough. Thanks.
Advertisement
Answer
First of all, this is a bad data model. You should store all SKUs in one column and have Fruit as primary key for Table2. You should also have another column year to denote when the SKU was assigned.
Here’s what you can try:
SELECT a.fruit,
a.sku,
coalesce(b.sku_2018, c.sku_2017, d.sku_2016) as sku_2018
FROM tab1 a
left join tab2 b
ON a.sku = b.sku_2018
left join tab2 c
ON a.sku = c.sku_2017
left join tab2 d
ON a.sku = d.sku_2016;