将(< = 4)x 2 SQL结果集转换为1 x 8结果集

时间:2018-01-11 21:44:42

标签: sql-server pivot

我花了很长时间试图弄清楚TSQL如何运作,所以我发布这个希望了解枢轴的人可以帮助我。

所以这是一个代表性的源结果集:
请注意,只有3行,但仍然是< = 4。

| Code  | Date       |
|-------|------------|
| 12345 | 2018-01-01 |
| 67890 | NULL       |
| 13579 | 2018-01-02 |

这是我想要的源结果集:

| Code_1 | Date_1     | Code_2 | Date_2 | Code_3 | Date_3     | Code_4 | Date_4 |
|--------|------------|--------|--------|--------|------------|--------|--------|
| 12345  | 2018-01-01 | 67890  | NULL   | 13579  | 2018-01-02 | NULL   | NULL   |

2 个答案:

答案 0 :(得分:2)

通过将2个数据透视查询结合在一起,您可以通过以下方式完成所需的操作:

DECLARE @tbl TABLE (code INT, dt DATETIME)
INSERT INTO @tbl VALUES (12345, '1/1/2018')
INSERT INTO @tbl VALUES (67890, null)
INSERT INTO @tbl VALUES (13579, '1/1/2018')

SELECT SQ1.Code_1, SQ2.Code_1, SQ1.Code_2, SQ2.Code_2, SQ1.Code_3, SQ2.Code_3, SQ1.Code_4, SQ2.Code_4
FROM
(
    SELECT [Code_1], [Code_2], [Code_3], [Code_4]
    FROM 
    (
        SELECT 'Code_' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS VARCHAR(3)) AS RowID, code FROM @tbl
    ) source
    PIVOT
    (
        MAX(code)
        FOR RowID IN ([Code_1], [Code_2], [Code_3], [Code_4])
    )sq
)SQ1
CROSS APPLY
(
    SELECT [Code_1], [Code_2], [Code_3], [Code_4]
    FROM 
    (
        SELECT 'Code_' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS VARCHAR(3)) AS RowID, dt FROM @tbl
    ) source
    PIVOT
    (
        MAX(dt)
        FOR RowID IN ([Code_1], [Code_2], [Code_3], [Code_4])
    )sq
)SQ2 

输出:

Code_1  Code_1      Code_2  Code_2  Code_3  Code_3      Code_4  Code_4
12345   2018-01-01  67890   NULL    13579   2018-01-01  NULL    NULL

答案 1 :(得分:1)

假设您最多需要4组(8列)。

您可能还会注意到我使用的顺序(选择空)。如果没有正确的序列密钥,就没有订单的gtd。

示例

Select Code_1 = max(case when Col=1 then Code end)
      ,Date_1 = max(case when Col=1 then Date end)
      ,Code_2 = max(case when Col=2 then Code end)
      ,Date_2 = max(case when Col=2 then Date end)     
      ,Code_3 = max(case when Col=3 then Code end)
      ,Date_3 = max(case when Col=3 then Date end)     
      ,Code_4 = max(case when Col=4 then Code end)
      ,Date_4 = max(case when Col=4 then Date end)     
 From (
        Select *
              ,Col = Row_Number() over (Order by (Select null))  
         From  @YourTable
      ) A

<强>返回

Code_1   Date_1     Code_2  Date_2  Code_3  Date_3      Code_4  Date_4
12345   2018-01-01  67890   NULL    13579   2018-01-01  NULL    NULL