【问题标题】:How to pivot on two levels如何在两个层面上旋转
【发布时间】:2016-10-30 03:58:16
【问题描述】:

我正在使用 SQL Server 2012 并尝试根据下表从 TSQL 构建一个数据透视表,该表是通过连接多个表生成的。

INCIDENT ID | Department | Priority      | Impact 
--------------------------------------------
1           | IT         | Urgent        | High
2           | IT         | Retrospective | Medium   
3           | Marketing  | Normal        | Low
4           | Marketing  | Normal        | High
5           | Marketing  | Normal        | Med
6           | Finance    | Normal        | Med

从此表格中,希望它以下列格式显示:

Priority     | Normal              | Urgent              | Retrospective       |
| Department | Low | Medium | High | Low | Medium | High | Low | Medium | High |
--------------------------------------------------------------------------------
| IT         |   1 |      1 |    0 |   1 |      1 |    0 |   1 |      1 |    0 |
| Finance    |   0 |      0 |    1 |   1 |      1 |    0 |   1 |      1 |    0 |
| Marketing  |   0 |      1 |    0 |   1 |      1 |    0 |   1 |      1 |    0 |

我有以下代码成功地在“优先级”级别上进行透视。

SELECT *
FROM (
    SELECT 
        COUNT(incident.incident_id) OVER(PARTITION BY serv_dept.serv_dept_n) Total,
        serv_dept.serv_dept_n       Department,
        ImpactName.item_n           Impact,
        PriorityName.item_n         Priority    
    FROM --  ommitted for brevity
    WHERE  -- ommitted for brevity
) AS T

PIVOT (
    COUNT(Priority)
    FOR Priority IN ("Normal", "Urgent", "Retrospective")
) PIV
ORDER BY Department ASC

我怎样才能让这个查询像我粘贴的第二个表一样在两个级别上进行旋转? 任何帮助将不胜感激。

【问题讨论】:

  • 您的样本数据没有“财务”部门。这些信息从何而来?
  • 这只是我出于解释目的而输入的随机数据。

标签: sql-server database tsql pivot relational-database


【解决方案1】:

最简单的方法可能是条件聚合:

select department,
       sum(case when priority = 'Normal' and target = 'Low' then 1 else 0 end) as Normal_low,
       sum(case when priority = 'Normal' and target = 'Med' then 1 else 0 end) as Normal_med,
       sum(case when priority = 'Normal' and target = 'High' then 1 else 0 end) as Normal_high,
       . . .
from t
group by department;

【讨论】:

    【解决方案2】:

    我会试一试:

    WITH PivotData AS
    (
        SELECT
            Department
            , Priority + '_' + Impact AS PriorityImpact
            , Incident_ID
        FROM
            <table>
    )
    SELECT
        Department
        , Normal_Low
        , Normal_Medium
        ,...
    FROM
    PivotData
    PIVOT (COUNT(Incident_ID FOR PriorityImpact IN (<Listing all the PriorityImpact values>) ) as P;
    

    【讨论】:

    • 这个方法可以移植到其他数据库吗?
    • 这个语法是针对 TSQL 的。我不知道你说的其他数据库。我认为这必须取决于供应商是否支持 PIVOT 以及该供应商的特定语法。
    • 感谢您提出解决方案。我假设您拥有的 WITH 子句与我在 OP 中使用的选择子查询是等价的。不过我觉得我更喜欢 Gordon Linoff 的回答。
    • 我同意你的看法。我也喜欢戈登的回答。我添加此答案的唯一原因是因为您似乎要求提供枢轴解决方案。
    猜你喜欢
    • 2021-09-02
    • 2018-06-28
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多