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 |