Reputation: 177
I tried following query but i am getting repeated rows, i want both results extra rows should be marked Null.
WITH E_CTE (Column1,Column2,Column3)AS
(Select Column1,Column2,Column3 From Table1 as c1 )
Select x.*,y.*
from (SELECT * from E_CTE Where column3='Yes') as x,
(SELECT * FROM E_CTE Where column3='No') as y
Upvotes: 1
Views: 37
Reputation: 6656
And another solution is using FULL JOIN
like this -
Schema
DECLARE @T TABLE (Column1 int, Column2 VARCHAR(10), Column3 VARCHAR(10));
INSERT @T
VALUES (1, 'A', 'YES'), (2, 'B', 'YES'), (3, 'C', 'NO'), (4, 'D', 'NO'), (5, 'E', 'NO');
Query
;WITH E_CTE
AS
( SELECT
Column1
,Column2
,Column3
,rn = ROW_NUMBER() OVER (PARTITION BY c1.Column3 ORDER BY c1.Column1)
FROM @T AS c1
)
SELECT
Column1Yes
,Column2Yes
,Column1No
,Column2No
FROM (SELECT
Column1 AS Column1Yes
,Column2 AS Column2Yes
,rn
FROM E_CTE
WHERE column3 = 'Yes') AS x
FULL JOIN (SELECT
Column1 AS Column1No
,Column2 AS Column2No
,rn
FROM E_CTE
WHERE column3 = 'No') AS y
ON x.rn = y.rn
Output
Column1Yes Column2Yes Column1No Column2No
1 A 3 C
2 B 4 D
NULL NULL 5 E
Upvotes: 1
Reputation: 176144
Using windowed function ROW_NUMBER
and conditional aggregation:
WITH cte AS (
SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY Column3 ORDER BY Column1)
FROM #Table1
)
SELECT Column1Yes = MAX(CASE WHEN Column3 = 'yes' THEN Column1 END),
Column2Yes = MAX(CASE WHEN Column3 = 'yes' THEN Column2 END),
Column1No = MAX(CASE WHEN Column3 = 'no' THEN Column1 END),
Column2No = MAX(CASE WHEN Column3 = 'no' THEN Column2 END)
FROM cte
GROUP BY rn;
Output:
╔════════════╦════════════╦═══════════╦═══════════╗
║ Column1Yes ║ Column2Yes ║ Column1No ║ Column2No ║
╠════════════╬════════════╬═══════════╬═══════════╣
║ 1 ║ A ║ 3 ║ C ║
║ 2 ║ B ║ 4 ║ D ║
║ ║ ║ 5 ║ E ║
╚════════════╩════════════╩═══════════╩═══════════╝
Upvotes: 1