2013-02-17 77 views
1

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

 
declare @t table( 
prod_type NVARCHAR(20), 
WEEK NVARCHAR(20), 
COD_ACCT NVARCHAR(20), 
BBH NVARCHAR(20) 
); 

INSERT INTO @t VALUES ('Salary', '41306', '12313', 'Vikas'), 
('Salary', '41306', '311', 'Ramesh'), 
('Salary', '41306', '55', 'Vicky'), 
('Salary', '41306', '44', 'Vicky'), 
('Salary', '41313', '33', 'Vikas'), 
('Salary', '41313', '22', 'Vikas'), 
('Salary', '41313', '11', 'Ramesh'), 
('Salary', '41313', '99', 'Vicky'), 
('Salary', '41320', '88', 'Vicky'), 
('Salary', '41320', '76', 'Vikas'), 
('Salary', '41320', '545', 'Ramesh'), 
('Savings', '41306', '3', 'Vicky'), 
('Savings', '41306', '27', 'Ramesh'), 
('Savings', '41306', '324', 'Ramesh'), 
('Savings', '41306', '887', 'Vikas'), 
('Savings', '41313', '998', 'Vicky'), 
('Savings', '41313', '6754', 'Vikas'), 
('Savings', '41313', '3457', 'Ramesh'), 
('Savings', '41313', '5434', 'Vicky'), 
('Savings', '41320', '6554', 'Ramesh'), 
('Savings', '41320', '3322', 'Ramesh'), 
('Savings', '41320', '6542', 'Vikas') 
;

现在我想在下面的格式 -

   Salary       ST   Savings    STT GT 

Row Labels 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 
Vicky   2  1   1  4  1  2   0   3 7 
Vikas   1  2   1  4  1  1   1   3 7 
Grand Total 4  4   3  11  4  4   3   11 22 

注意 - ST =工资总额,STT =储蓄总额,GT =总计(如获得枢纽在Excel)

输出我现在所做的是将表格转换为Excel,并使用COUNT of COD_ACCT在Excel和Excel中的值和在行和Prod_type中的BBH以及在Excel中的数据透视中的列中创建一周。

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

谢谢!

+0

欢迎StackOverflow上:如果您发布的代码,XML或数据样本,** **请那些突出线条在文本编辑器,然后单击“代码示例”按钮('{}')在编辑器工具栏上进行恰当的格式化和语法突出显示! – 2013-02-17 12:21:32

+0

请推荐任何像PIVOT或CUBE语法和任何其他语法的简洁SQL – 2013-02-17 12:44:38

回答

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

谢谢你的好友!这非常有帮助! – 2013-02-19 13:54:10

+0

@VivekSingh我很高兴它为你工作。如果您发现此答案有帮助,请务必通过左侧的复选标记接受此答案。它会让未来的访问者知道这个问题已经得到解答,你会得到网站代表接受。 :) – Taryn 2013-02-19 13:55:18