Sql server 2008 SQL Server:将每组行选择为一行
很难描述我想知道什么。粗略地说,就是“将每组行选择成一行” 请参考链接图像 谢谢 dbo.SourceTableSql server 2008 SQL Server:将每组行选择为一行,sql-server-2008,Sql Server 2008,很难描述我想知道什么。粗略地说,就是“将每组行选择成一行” 请参考链接图像 谢谢 dbo.SourceTable group column1 column2 ------------------------ A A1 AA1 A A2 AA2 A A3 AA3 A A4 AA4 A A5 AA5 B B1 BB1 B B2 BB2 B B3 BB3 B B4 BB4 B B5 BB5 C C1 CC1 C C2 CC2
group column1 column2
------------------------
A A1 AA1
A A2 AA2
A A3 AA3
A A4 AA4
A A5 AA5
B B1 BB1
B B2 BB2
B B3 BB3
B B4 BB4
B B5 BB5
C C1 CC1
C C2 CC2
C C3 CC3
C C4 CC4
C C5 CC5
D D1 DD1
D D2 DD2
D D3 DD3
D D4 DD4
D D5 DD5
预期结果:
group result1 result2 result3 result4 result5 result6 result7 result8 result9 result10
A A1 AA1 A2 AA2 A3 AA3 A4 AA4 A5 AA5
B B1 BB1 B2 BB2 B3 BB3 B4 BB4 B5 BB5
C C1 CC1 C2 CC2 C3 CC3 C4 CC4 C5 CC5
D D1 DD1 D2 DD2 D3 DD3 D4 DD4 D5 DD5
没有简单的方法可以在多个列上旋转。但有一个窍门: 您可以连接两个列,并对连接的值进行透视。更好的是:您可以让连接的值看起来像XML(,而无需将其转换为真正的XML),并以此为轴心。这种方法可以很容易地获取值typesafe 但我必须承认:这是相当多的打字:-)
这是一种方法:
CREATE TABLE #tt(id INT IDENTITY(1,1),[group] VARCHAR(16),[column1] VARCHAR(16),[column2] VARCHAR(16))
INSERT INTO #tt([group],[column1],[column2])VALUES
('A','A1','AA1'),
('A','A2','AA2'),
('A','A3','AA3'),
('A','A4','AA4'),
('A','A5','AA5'),
('B','B1','BB1'),
('B','B2','BB2'),
('B','B3','BB3'),
('B','B4','BB4'),
('B','B5','BB5'),
('C','C1','CC1'),
('C','C2','CC2'),
('C','C3','CC3'),
('C','C4','CC4'),
('C','C5','CC5'),
('D','D1','DD1'),
('D','D2','DD2'),
('D','D3','DD3'),
('D','D4','DD4'),
('D','D5','DD5');
;WITH group_order AS (
SELECT
*,
group_order_id=ROW_NUMBER() OVER (PARTITION BY [group] ORDER BY id)
FROM
#tt
)
SELECT
[group],
result1=MAX(CASE WHEN group_order_id=1 THEN [column1] END),
result2=MAX(CASE WHEN group_order_id=1 THEN [column2] END),
result3=MAX(CASE WHEN group_order_id=2 THEN [column1] END),
result4=MAX(CASE WHEN group_order_id=2 THEN [column2] END),
result5=MAX(CASE WHEN group_order_id=3 THEN [column1] END),
result6=MAX(CASE WHEN group_order_id=3 THEN [column2] END),
result7=MAX(CASE WHEN group_order_id=4 THEN [column1] END),
result8=MAX(CASE WHEN group_order_id=4 THEN [column2] END),
result9=MAX(CASE WHEN group_order_id=5 THEN [column1] END),
result10=MAX(CASE WHEN group_order_id=5 THEN [column2] END)
FROM
group_order
GROUP BY
[group];
DROP TABLE #tt;
结果:
+-------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+
| group | result1 | result2 | result3 | result4 | result5 | result6 | result7 | result8 | result9 | result10 |
+-------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+
| A | A1 | AA1 | A2 | AA2 | A3 | AA3 | A4 | AA4 | A5 | AA5 |
| B | B1 | BB1 | B2 | BB2 | B3 | BB3 | B4 | BB4 | B5 | BB5 |
| C | C1 | CC1 | C2 | CC2 | C3 | CC3 | C4 | CC4 | C5 | CC5 |
| D | D1 | DD1 | D2 | DD2 | D3 | DD3 | D4 | DD4 | D5 | DD5 |
+-------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+
因此,换句话说,您希望透视行=)。您的锤子当然是XQuery/XML=)是的,每当遇到一个小问题时,我就使用XXLXML并粉碎!!!但我必须承认,总体案例法也很好,投了赞成票。它不仅好,而且会比你的好。PIVOT的性能通常比老式的PIVOT方法差,而且所有的XML解析肯定会减慢速度。无论如何,知道XMLMagic也能做到这一点总是好的=)@TT。是的,你肯定是对的。亲爱的JoonYoung Kim:如果你想接受其中一个答案,我建议你接受TT的答案。我将尝试创建一个纯聚合情况的句柄,使我的XXLXML锤子更加强大!:-)
CREATE TABLE #tt(id INT IDENTITY(1,1),[group] VARCHAR(16),[column1] VARCHAR(16),[column2] VARCHAR(16))
INSERT INTO #tt([group],[column1],[column2])VALUES
('A','A1','AA1'),
('A','A2','AA2'),
('A','A3','AA3'),
('A','A4','AA4'),
('A','A5','AA5'),
('B','B1','BB1'),
('B','B2','BB2'),
('B','B3','BB3'),
('B','B4','BB4'),
('B','B5','BB5'),
('C','C1','CC1'),
('C','C2','CC2'),
('C','C3','CC3'),
('C','C4','CC4'),
('C','C5','CC5'),
('D','D1','DD1'),
('D','D2','DD2'),
('D','D3','DD3'),
('D','D4','DD4'),
('D','D5','DD5');
;WITH group_order AS (
SELECT
*,
group_order_id=ROW_NUMBER() OVER (PARTITION BY [group] ORDER BY id)
FROM
#tt
)
SELECT
[group],
result1=MAX(CASE WHEN group_order_id=1 THEN [column1] END),
result2=MAX(CASE WHEN group_order_id=1 THEN [column2] END),
result3=MAX(CASE WHEN group_order_id=2 THEN [column1] END),
result4=MAX(CASE WHEN group_order_id=2 THEN [column2] END),
result5=MAX(CASE WHEN group_order_id=3 THEN [column1] END),
result6=MAX(CASE WHEN group_order_id=3 THEN [column2] END),
result7=MAX(CASE WHEN group_order_id=4 THEN [column1] END),
result8=MAX(CASE WHEN group_order_id=4 THEN [column2] END),
result9=MAX(CASE WHEN group_order_id=5 THEN [column1] END),
result10=MAX(CASE WHEN group_order_id=5 THEN [column2] END)
FROM
group_order
GROUP BY
[group];
DROP TABLE #tt;
+-------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+
| group | result1 | result2 | result3 | result4 | result5 | result6 | result7 | result8 | result9 | result10 |
+-------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+
| A | A1 | AA1 | A2 | AA2 | A3 | AA3 | A4 | AA4 | A5 | AA5 |
| B | B1 | BB1 | B2 | BB2 | B3 | BB3 | B4 | BB4 | B5 | BB5 |
| C | C1 | CC1 | C2 | CC2 | C3 | CC3 | C4 | CC4 | C5 | CC5 |
| D | D1 | DD1 | D2 | DD2 | D3 | DD3 | D4 | DD4 | D5 | DD5 |
+-------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+