枢轴SQL语句
问题描述:
我有一个表像这样的(当然还有更多的值,但你的想法):枢轴SQL语句
ID Name
--- ----
1 A
1 B
2 C
3 D
4 A
4 D
4 E
4 F
4 G
4 H
我想写给出一个查询,将输出这是一个ID不能有超过6个名字。
ID Name1 Name2 Name3 Name4 Name5 Name6
--- ------ ------ ------ ------ ------ -----
1 A B
2 C
3 D
4 A D E F G H
答
尝试:
WITH rows AS (
SELECT t.id,
t.name,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.name) 'rank'
FROM TABLE t)
SELECT r.id,
MAX(CASE WHEN r.rank = 1 THEN r.name ELSE NULL END) AS Name1,
MAX(CASE WHEN r.rank = 2 THEN r.name ELSE NULL END) AS Name2,
MAX(CASE WHEN r.rank = 3 THEN r.name ELSE NULL END) AS Name3,
MAX(CASE WHEN r.rank = 4 THEN r.name ELSE NULL END) AS Name4,
MAX(CASE WHEN r.rank = 5 THEN r.name ELSE NULL END) AS Name5,
MAX(CASE WHEN r.rank = 6 THEN r.name ELSE NULL END) AS Name6,
FROM rows r
GROUP BY r.id
非CTE相当于:
SELECT r.id,
MAX(CASE WHEN r.rank = 1 THEN r.name ELSE NULL END) AS Name1,
MAX(CASE WHEN r.rank = 2 THEN r.name ELSE NULL END) AS Name2,
MAX(CASE WHEN r.rank = 3 THEN r.name ELSE NULL END) AS Name3,
MAX(CASE WHEN r.rank = 4 THEN r.name ELSE NULL END) AS Name4,
MAX(CASE WHEN r.rank = 5 THEN r.name ELSE NULL END) AS Name5,
MAX(CASE WHEN r.rank = 6 THEN r.name ELSE NULL END) AS Name6,
FROM (SELECT t.id,
t.name,
ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.name) 'rank'
FROM TABLE t) r
GROUP BY r.id
参考:
答
我创建了一个名为pivot_query的存储过程,使得PIVOT语句更加灵活一些。它的来源是here。还有一个关于如何使用它的example。
借用一块从下面OMG小马代码,并更改查询了一下, 然后调用pivot_query应该是这样的:
declare @mySQL varchar(MAX)
set @mySQL = '
SELECT
t.id,
t.name,
''Name'' + cast(ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.name) as varchar(2)) rank
FROM
TestData t'
exec pivot_query @mySQL, 'Id', 'rank', 'max(Name)'
和现在的结果是这样的:
Id Name1 Name2 Name3 Name4 Name5 Name6
---------- ----- ----- ----- ----- ----- -----
1 A B NULL NULL NULL NULL
2 C NULL NULL NULL NULL NULL
3 D NULL NULL NULL NULL NULL
4 A D E F G H
不完全确定你要展示什么,但。 :-)
这不会本质上限制输出到6个列,虽然,它会继续往上走,除非你添加一个where子句来明确排除上述行列6.
+0
关闭,但没有雪茄。我不希望G&H显示在Name_7和Name_8列中,而是显示在Name5和Name 6列中。我也不想在测试数据表中输入名称。 – LWoodyiii 2010-01-18 01:16:13
@Lwoodyiii - 我在我的回复中发现了一个错误。我不认为它会外推到6 - 建议你稍微扩展你的问题,以给出完整的图片。 – 2010-01-18 00:28:51
@Martin我编辑它。请把你的答案备份起来,我想这可以扩展到正确的答案。我认为这是一个有用的开始。 谢谢! – LWoodyiii 2010-01-18 00:32:53
什么版本的SQL Server? – 2010-01-18 00:37:24