SQL数据透视表嵌套

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

 申报@t表(  
  prod_type NVARCHAR(20),  
  WEEK NVARCHAR(20),  
  COD_ACCT NVARCHAR(20),  
  BBH NVARCHAR(20)  
  );

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

现在我想要输出格式如下 –

 工资ST储蓄STT GT

行标签01-Feb-13 08-Feb-13 15-Feb-13 01-Feb-13 08-Feb-13 15-Feb-13    
 Ramesh 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和Excel中使用COUNT of COD_ACCT的COUNT和在Row和Prod_type中使用BBH,在Excel中使用Pivot中的列使用Week。

我可以在TSql中做同样的事情吗? 这将节省我所有的枢轴麻烦。

谢谢!

您可以使用PIVOT函数以及SQL Server 2008+中的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小提琴 。

这给出了结果:

 | 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 |