将 2 SQL 行转置为没有单个记录行的列
Transpose 2 SQL rows to Columns without single record rows
我正在尝试设计一个查询以在 SQL 中转置以下 table:
|Name| |Type|
A X
B X
C Y
D Y
E Z
输出:
|X| |Y| |Z|
A C E
B D <Blank>
但我最终得到的是 pivot 或 max case 语句:
|X| |Y| |Z|
A Null Null
B Null Null
Null C Null
Null D Null
Null Null E
这可能吗?提前致谢;
试试这个:
SELECT MAX(CASE WHEN Type = 'X' THEN Name END),
MAX(CASE WHEN Type = 'Y' THEN Name END),
MAX(CASE WHEN Type = 'Z' THEN Name END)
FROM (
SELECT Name, Type,
ROW_NUMBER() OVER (PARTITION BY Type ORDER BY (SELECT NULL)) AS rn
FROM mytable) AS t
GROUP BY rn
如果出于某种原因您有重复的 [Name]、[Type] 记录并且只想查看一个,您可以使用 DENSE_RANK 而不是 ROW_NUMBER。这也是 PIVOT 版本。
SELECT [X], [Y], [Z]
FROM (
SELECT [Name], [Type],
DENSE_RANK() OVER( PARTITION BY [Type] ORDER BY [Name]) Rn
FROM Table1) t
PIVOT (
MAX([Name])
FOR [Type] IN ([X], [Y], [Z])) p
我正在尝试设计一个查询以在 SQL 中转置以下 table:
|Name| |Type|
A X
B X
C Y
D Y
E Z
输出:
|X| |Y| |Z|
A C E
B D <Blank>
但我最终得到的是 pivot 或 max case 语句:
|X| |Y| |Z|
A Null Null
B Null Null
Null C Null
Null D Null
Null Null E
这可能吗?提前致谢;
试试这个:
SELECT MAX(CASE WHEN Type = 'X' THEN Name END),
MAX(CASE WHEN Type = 'Y' THEN Name END),
MAX(CASE WHEN Type = 'Z' THEN Name END)
FROM (
SELECT Name, Type,
ROW_NUMBER() OVER (PARTITION BY Type ORDER BY (SELECT NULL)) AS rn
FROM mytable) AS t
GROUP BY rn
如果出于某种原因您有重复的 [Name]、[Type] 记录并且只想查看一个,您可以使用 DENSE_RANK 而不是 ROW_NUMBER。这也是 PIVOT 版本。
SELECT [X], [Y], [Z]
FROM (
SELECT [Name], [Type],
DENSE_RANK() OVER( PARTITION BY [Type] ORDER BY [Name]) Rn
FROM Table1) t
PIVOT (
MAX([Name])
FOR [Type] IN ([X], [Y], [Z])) p