SQL动态数据透视表,具有特定列的总和

时间:2018-02-12 21:20:19

标签: sql-server

您好我遇到了一个问题,我在尝试总结动态数据透视表上的特定列。

例如

employee_number   last_name   first_name   salary   State   dept_id
12009             Gibson      Graham       54000    KZN     45
34974             Parker      Fred         80000    KZN     45
34987             Erickson    Neil         42000    GP      45
45001             Yates       Sally        57500    NC      30
75623             Gates       Steve        65000    GP      30
64421             Arthur      Barron       18000    GP      30
74454             James       Marther      14555    GP      25
21554             Sally       Hanson       77500    KZN     20
22132             Malcolm     Mabuna       45000    KZN     20

我正在寻找的是能够输出每个州的工资总和和每个dept_id的列。 dept_id需要是动态的,因为我可以在一个查询中获得10个dept_id,在下一个查询中获得25个dept_id。这一切都很好。

我正在努力弄清楚的是我还需要一个专栏,基本上说如果dept_id 10,11,15,20和30的工资总和超过100,000,那么其他是0.我想到的只是简单地创建轮回数据并添加列。但是,正如您在此示例中所看到的,有时没有dept_id 10,11或15.当发生这种情况时,它必须将dept_id 20和30的工资加起来。所以我需要一种方法:

  1. 创建一个动态数据透视表,以显示每个状态的数据,显示工资总和。
  2. 总结工资值(如果存在),其中dept_id为10,11,15,20或30.
  3. 
        State   dept_id_20  dept_id_25  dept_id_30  dept_id_45    Sum   Result
        GP               0       14555       83000       42000      0        0
        KZN         122500           0           0      134000 122500        1 
        NC               0           0       57500           0      0        0
    
    

    非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

我选择使用不同的方法来解决问题。有一个可能的dept_ids的有限列表。所以我使用了类似的代码:

select state, 
sum(dept_id_10), 
sum(dept_id_11),
sum(dept_id_12),
...
sum(dept_id_12),
case when sum(dept_id_10) + sum(dept_id_11) + sum(dept_id_15)
+ sum(dept_id_20) + sum(dept_id_30) > 100000 then 1 else 0) end as Result
from (
select state, 
case when dept_id = 10 then salary else 0 end as dept_id_10,
case when dept_id = 11 then salary else 0 end as dept_id_11,
case when dept_id = 12 then salary else 0 end as dept_id_12,
case when dept_id = 13 then salary else 0 end as dept_id_13,
...
case when dept_id = 45 then salary else 0 end as dept_id_45
from data)
group by state