如何在单列上进行旋转并从中创建多个列

时间:2018-03-10 11:53:05

标签: sql-server pivot

我有下表

+---------+----------+--------+------------+------------+
| Country | Provider | Status |  End Date  | Start Date |
+---------+----------+--------+------------+------------+
| US      | P1       |      1 | 1/1/2018   | 2/2/2016   |
| US      | P2       |      1 | 11/12/2017 | 3/11/2016  |
| US      | P3       |      1 | 10/11/2016 | 4/5/2016   |
| US      | P4       |      1 | 5/12/2016  | 9/1/2015   |
| China   | P1       |      2 | NA         | 2/2/2016   |
| China   | P2       |      2 | 11/19/2018 | 3/11/2016  |
| China   | P3       |      3 | 6/8/2018   | 4/5/2016   |
| China   | P4       |      1 | 9/6/2017   | 9/1/2015   |
+---------+----------+--------+------------+------------+

预期结果

+---------+------+------+------+------+-----------+-----------+-----------+-----------+---------------+---------------+---------------+---------------+-------------+-------------+-------------+-------------+
| Country |  P1  |  P2  |  P3  |  P4  | P1 Status | P2 Status | P3 Status | P4 Status | P1 Start Date | P2 Start Date | P3 Start Date | P4 Start Date | P1 End Date | P2 End Date | P3 End Date | P14End Date |
+---------+------+------+------+------+-----------+-----------+-----------+-----------+---------------+---------------+---------------+---------------+-------------+-------------+-------------+-------------+
| US      | NULL | NULL | NULL | NULL |         1 |         1 |         1 |         1 | 2/2/2016      | 3/11/2016     | 4/5/2016      | 9/1/2015      | 1/1/2018    | 11/12/2017  | 10/11/2016  | 5/12/2016   |
| China   | NULL | NULL | NULL | NULL |         1 |         2 |         3 |         1 | 2/2/2016      | 3/11/2016     | 4/5/2016      | 9/1/2015      | NA          | 11/19/2018  | 6/8/2018    | 9/6/2017    |
+---------+------+------+------+------+-----------+-----------+-----------+-----------+---------------+---------------+---------------+---------------+-------------+-------------+-------------+-------------+
你们可以帮助我调整这个表来获得预期的输出吗?

P.S。 - 不要担心NULL列(P1,P2,P3和P4),我可以在SELECT语句中动态创建它们。

1 个答案:

答案 0 :(得分:0)

我已将MAX功能与CASEIIF结合使用,以达到过去类似的效果。基本上,您必须手动转动表。 CASEIIF仅用于根据辅助选择器(在您的情况下为Provider)返回值。然后MAX删除为其他提供商创建的NULL值。

这是一个简短的片段,可以帮助您入门。您应该能够将其展开以构建您期望的表格。

SELECT
     Country,
     P1Status = MAX(IIF(Provider = 'P1', Status, NULL)),
     P2Status = MAX(IIF(Provider = 'P2', Status, NULL)),
     P1StartDate = MAX((IIF(Provider = 'P1', StartDate, NULL)),
     P2StartDate = MAX((IIF(Provider = 'P1', StartDate, NULL))
FROM
     Table
GROUP BY
     Country