Here’s my dataset with expected out. But I am having issues doing it.
Also, I attached the query I created and the output is not correct. could you please point me to where my mistake is?
x
DROP TABLE #TEMP_ROLES
DROP TABLE #ORG_ROLES
CREATE TABLE #TEMP_ROLES
(
ID INT,
DESCRIPTIONS CHAR(15)
)
INSERT INTO #TEMP_ROLES VALUES (1, 'ROLE 1')
INSERT INTO #TEMP_ROLES VALUES (2, 'ROLE 2')
INSERT INTO #TEMP_ROLES VALUES (3, 'ROLE 3')
INSERT INTO #TEMP_ROLES VALUES (4, 'ROLE 4')
INSERT INTO #TEMP_ROLES VALUES (5, 'ROLE 5')
CREATE TABLE #ORG_ROLES
(
ID INT,
NAME CHAR(15),
)
INSERT INTO #ORG_ROLES VALUES (1, 'NAME_1')
INSERT INTO #ORG_ROLES VALUES (2, 'NAME_1')
INSERT INTO #ORG_ROLES VALUES (3, 'NAME_1')
INSERT INTO #ORG_ROLES VALUES (1, 'NAME_2')
INSERT INTO #ORG_ROLES VALUES (2, 'NAME_2')
INSERT INTO #ORG_ROLES VALUES (3, 'NAME_2')
INSERT INTO #ORG_ROLES VALUES (4, 'NAME_2')
INSERT INTO #ORG_ROLES VALUES (5, 'NAME_2')
INSERT INTO #ORG_ROLES VALUES (1, 'NAME_3')
This is the query I created but the output is incorrect.
SELECT NAME,
CASE WHEN TR.ID = 1 THEN 'YES' ELSE 'NO' END AS ROLE_1,
CASE WHEN TR.ID = 2 THEN 'YES' ELSE 'NO' END AS ROLE_2,
CASE WHEN TR.ID = 3 THEN 'YES' ELSE 'NO' END AS ROLE_3,
CASE WHEN TR.ID = 4 THEN 'YES' ELSE 'NO' END AS ROLE_4,
CASE WHEN TR.ID = 5 THEN 'YES' ELSE 'NO' END AS ROLE_5
FROM #TEMP_ROLES TR
LEFT JOIN #ORG_ROLES R ON TR.ID = R.ID
Expected output:
NAME ROLE_1 ROLE_2 ROLE_3 ROLE_4 ROLE_5
NAME_1 YES YES YES NO NO
NAME_2 YES YES NO YES YES
NAME_3 YES NO NO NO NO
Advertisement
Answer
You’re almost there – you just need to add aggregation:
SELECT NAME,
MAX(CASE WHEN TR.ID = 1 THEN 'YES' ELSE 'NO' END) AS ROLE_1,
MAX(CASE WHEN TR.ID = 2 THEN 'YES' ELSE 'NO' END) AS ROLE_2,
MAX(CASE WHEN TR.ID = 3 THEN 'YES' ELSE 'NO' END) AS ROLE_3,
MAX(CASE WHEN TR.ID = 4 THEN 'YES' ELSE 'NO' END) AS ROLE_4,
MAX(CASE WHEN TR.ID = 5 THEN 'YES' ELSE 'NO' END) AS ROLE_5
FROM #TEMP_ROLES TR
LEFT JOIN #ORG_ROLES R ON TR.ID = R.ID
GROUP BY NAME