【问题标题】:How to pivot on SQL-Server multiple columns?如何以 SQL-Server 多列为中心?
【发布时间】:2017-11-14 06:30:30
【问题描述】:

我正在尝试创建一个 SQL 语句来将可变数量的行转换为单行。一小部分数据如下所示:

+--------------+--------+-------+-------+
|      ID      | Flag   | workD | holiD |
+--------------+--------+-------+-------+
| 11155        | N      | 1     | 0     |
| 11155        | D      | 1     | 1     |
| 5675         | N      | 1     | 1     |
| 98761        | N      | 0     | 1     |
| 98761        | D      | 1     | 1     |
+--------------+--------+-------+-------+

我想将数据转换为如下所示:

+--------------+---------+---------+---------+---------+
|      ID      | N_wordD | N_holiD | D_wordD | D_holiD |
+--------------+---------+---------+---------+---------+
| 11155        | 1       | 0       | 1       | 1       |
| 5675         | 1       | 1       | NULL    | NULL    |
| 98761        | 0       | 1       | 1       | 1       |
+--------------+---------+---------+---------+---------+

在旋转时我有点不知所措,特别是当我想将样式和数量都旋转到我的列中时。

任何建议、指针等将不胜感激。

【问题讨论】:

  • 可用的标志只有'N'和'D'吗?

标签: sql-server pivot


【解决方案1】:

我认为您不需要在这里设置支点,而是可以尝试使用 Case 和 Group By 的组合。试试下面的

WITH CTE
AS
(
    SELECT
    ID,
    N_WorkD = CASE WHEN Flag = 'N' THEN WorkD ELSE 0 END ,
    N_holiD = CASE WHEN Flag = 'N' THEN holiD ELSE 0 END,
    D_WorkD = CASE WHEN Flag = 'D' THEN WorkD ELSE 0 END ,
    D_holiD = CASE WHEN Flag = 'D' THEN holiD ELSE 0 END
    FROM T1
)
SELECT
  ID,
  N_WorkD = SUM(N_WorkD),
  N_holiD = SUM(N_holiD),
  D_WorkD = SUM(D_WorkD),
  D_holiD = SUM(D_holiD)
  FROM CTE
    GROUP BY ID

示例结果如下

在这里查看SQLFiddle

【讨论】:

    猜你喜欢
    • 2017-02-05
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多