Reputation: 23
I want to select two values that are tied to a table and if they don't exist, populate a null value. But, I only want one row for each record. If I run the query below, the CASE statements create duplicate rows.
SELECT DISTINCT YT.TITLE, YT.DETAILS,
CASE WHEN XT.ACOLUMN = 'CATEGORY' THEN XT.BCOLUMN END AS CATEGORY,
CASE WHEN XT.ACOLUMN = 'DIVISION' THEN XT.BCOLUMN END AS DIVISION
FROM DB.YTABLE YT
LEFT OUTER JOIN DB.XTABLE XT
ON YT.ID_NUM = XT.ID_NUM
Data I want:
TitleExample1, DetailsExample1, Category1, Division1
TitleExample2, DetailsExample2, null, Division2
Data I am getting:
TitleExample1, DetailsExample1, Category1, null
TitleExample1, DetailsExample1, null, Division1
TitleExample1, DetailsExample1, null, null
TitleExample2, DetailsExample2, null, Division2
TitleExample2, DetailsExample2, null, null
I also tried doing a join using multiple table identities for the same table:
SELECT DISTINCT YT.TITLE, YT.DETAILS, XT1.BCOLUMN AS CATEGORY1,
XT2.BCOLUMN AS DIVISION
LEFT OUTER JOIN DB.XTABLE XT1
ON YT.ID_NUM = XT.ID_NUM
LEFT OUTER JOIN DB.XTABLE XT2
ON YT.ID_NUM = XT.ID_NUM
WHERE XT1.ACOLUMN = 'CATEGORY' AND
XT2.ACOLUMN = 'DIVISION'
This works well if both category and division values are populated. But, if a title and details record does not have an associated category or division, the query will not select the record.
Data I want:
TitleExample1, DetailsExample1, Category1, Division1
TitleExample2, DetailsExample2, null, Division2
Data I am getting:
TitleExample1, DetailsExample1, Category1, Division1
Upvotes: 0
Views: 1700
Reputation: 58
your second approach is better, but you must add your condition in the ON statement of the OUTER JOIN
SELECT DISTINCT YT.TITLE, YT.DETAILS, XT1.BCOLUMN AS CATEGORY1, XT2.BCOLUMN AS DIVISION
FROM DB.YTABLE YT
LEFT OUTER JOIN DB.XTABLE XT1 ON (YT.ID_NUM = XT1.ID_NUM AND XT1.ACOLUMN = 'CATEGORY')
LEFT OUTER JOIN DB.XTABLE XT2 ON (YT.ID_NUM = XT2.ID_NUM AND XT2.ACOLUMN = 'DIVISION')
Upvotes: 1
Reputation: 24506
SELECT YT.TITLE, YT.DETAILS,
Min(CASE WHEN XT.ACOLUMN = 'CATEGORY' THEN XT.BCOLUMN END) AS CATEGORY,
Min(CASE WHEN XT.ACOLUMN = 'DIVISION' THEN XT.BCOLUMN END) AS DIVISION
FROM DB.YTABLE YT
LEFT OUTER JOIN DB.XTABLE XT
ON YT.ID_NUM = XT.ID_NUM
Group By YT.TITLE, YT.DETAILS
Upvotes: 0