1

我正在使用 Sql Server 2008 R2。我的工作是关于商业智能和报告。现在我有一张如下表。

声明@t 表(  
 prod_type NVARCHAR(20),  
 周 NVARCHAR(20),  
 COD_ACCT NVARCHAR(20),  
 BBH NVARCHAR(20)  
 );

 插入@t 值('薪水','41306','12313','Vikas'),  
 ('工资','41306','311','Ramesh'),  
 ('薪水','41306','55','Vicky'),  
 ('薪水','41306','44','Vicky'),  
 ('工资','41313','33','Vikas'),  
 ('薪水','41313','22','Vikas'),  
 ('工资','41313','11','Ramesh'),  
 ('薪水','41313','99','Vicky'),  
 ('薪水','41320','88','Vicky'),  
 ('工资','41320','76','Vikas'),  
 ('薪水','41320','545','Ramesh'),  
 ('储蓄','41306','3','Vicky'),  
 ('储蓄','41306','27','Ramesh'),  
 ('储蓄','41306','324','Ramesh'),  
 ('储蓄','41306','887','Vikas'),  
 ('储蓄','41313','998','Vicky'),  
 ('储蓄','41313','6754','Vikas'),  
 ('储蓄','41313','3457','Ramesh'),  
 ('储蓄','41313','5434','Vicky'),  
 ('储蓄','41320','6554','Ramesh'),  
 ('储蓄','41320','3322','Ramesh'),  
 (“储蓄”、“41320”、“6542”、“维卡斯”)  
 ;

现在我想要以下格式的输出 -

           工资 ST 储蓄 STT GT

行标签 01-Feb-13 08-Feb-13 15-Feb-13 01-Feb-13 08-Feb-13 15-Feb-13    
拉梅什 1 1 1 3 2 1 2 5 8  
维姬 2 1 1 4 1 2 0 3 7
维卡斯 1 2 1 4 1 1 1 3 7
总计 4 4 3 11 4 4 3 11 22

注意 - ST= 工资总额,STT= 储蓄总额,GT= 总计(在 Excel 中的数据透视表中获得)

我现在要做的是将表格放入 Excel 并使用 Excel 中的值中的 COD_ACCT 计数和行中的 BBH 以及 Excel 中枢轴中的列中的 Prod_type 和周进行数据透视。

我可以在 TSql 中做同样的事情吗?它将为我省去所有 Pivot 的麻烦。

谢谢!

4

1 回答 1

1

您可以在 SQL Server 2008+ 中使用该PIVOT功能。GROUPING SETS

您的代码将与此类似:

select 
  case when bbh is null then 'Grand Total' else bbh end bbh,
  sum([Salary_2013-02-03]) [Salary_2013-02-03], 
  sum([Salary_2013-02-10]) [Salary_2013-02-10], 
  sum([Salary_2013-02-17]) [Salary_2013-02-17],
  sum([Salary_2013-02-03]+[Salary_2013-02-10]+[Salary_2013-02-17]) ST,
  sum([Savings_2013-02-03]) [Savings_2013-02-03],
  sum([Savings_2013-02-10]) [Savings_2013-02-10], 
  sum([Savings_2013-02-17]) [Savings_2013-02-17],
  sum([Savings_2013-02-03]+[Savings_2013-02-10]+[Savings_2013-02-17]) STT
from 
(
  select 
    prod_type +'_'+
    convert(varchar(10), cast(cast(week as int) as datetime), 120) week, 
    cod_acct, 
    bbh
  from t
) src
pivot
(
  count(cod_acct)
  for week in ([Salary_2013-02-03], [Salary_2013-02-10], 
               [Salary_2013-02-17], [Savings_2013-02-03],
               [Savings_2013-02-10], [Savings_2013-02-17])
) piv
group by grouping sets((bbh), ())

请参阅SQL Fiddle with Demo

这给出了结果:

|         BBH | SALARY_2013-02-03 | SALARY_2013-02-10 | SALARY_2013-02-17 | ST | SAVINGS_2013-02-03 | SAVINGS_2013-02-10 | SAVINGS_2013-02-17 | STT |
-----------------------------------------------------------------------------------------------------------------------------------------------------
|      Ramesh |                 1 |                 1 |                 1 |  3 |                  2 |                  1 |                  2 |   5 |
|       Vicky |                 2 |                 1 |                 1 |  4 |                  1 |                  2 |                  0 |   3 |
|       Vikas |                 1 |                 2 |                 1 |  4 |                  1 |                  1 |                  1 |   3 |
| Grand Total |                 4 |                 4 |                 3 | 11 |                  4 |                  4 |                  3 |  11 |
于 2013-02-17T15:13:55.910 回答