Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server:将每组行选择为一行_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL Server:将每组行选择为一行

Sql 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

很难描述我想知道什么。粗略地说,就是“将每组行选择成一行”

请参考链接图像

谢谢

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
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      |
+-------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+