SQL server中的透视表问题
--枢轴的使用SQL server中的透视表问题,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,--枢轴的使用 create table newtest ( Section varchar(50), Department varchar(50), salesamount float ) Insert into newtest select 'Sec1','IT',2000.89 union select 'Sec1','IT',1000.89 union select 'Sec1','IT',3000.89 union select 'Sec1','BPO',2000.89
create table newtest (
Section varchar(50),
Department varchar(50),
salesamount float
)
Insert into newtest
select 'Sec1','IT',2000.89 union
select 'Sec1','IT',1000.89 union
select 'Sec1','IT',3000.89 union
select 'Sec1','BPO',2000.89 union
select 'Sec2','BPO',5000.89 union
select 'Sec2','IT',2700.89 union
select 'Sec2','BPO',2000.89 union
select 'Sec3','IT',6000.89 union
select 'Sec3','IT',2000.89 union
select 'Sec3','BPO',9000.89 union
select 'Sec4','IT',2000.89 union
select 'Sec4','BPO',6000.89 union
select 'Sec3','BPO',1000.89 union
select 'Sec4','IT',3000.89
select * from newtest
Select section, department, SUM(salesamount)
from newtest
Group by Section, Department
请帮助我解决这个问题…我在执行上述代码时得到了结果
select [Sec1] AS Sec1BPO,
[Sec2] AS Sec2BPO,
[Sec3] AS Sec3BPO,
[Sec4] AS Sec4BPO,
[Sec1] AS Sec1IT,
[Sec2] AS Sec2IT,
[Sec3] AS Sec3IT,
[Sec4] AS Sec4IT
from (select Section, Department, salesamount
from newtest) as Sourcetable
PIVOT( SUM([salesamount])
FOR [Section] IN ([Sec1],[Sec2],[Sec3],[Sec4]) ) AS Pivottable
ORDER BY Department
但我需要
Sec1BPO Sec2BPO Sec3BPO Sec4BPO Sec1IT Sec2IT Sec3IT Sec4IT
-------------------------------------------------------------------------
2000.89 7001.78 10001.78 6000.89 2000.89 7001.78 10001.78 6000.89
6002.67 2700.89 8001.78 5001.78 6002.67 2700.89 8001.78 5001.78
请帮我得到想要的结果
Sec1BPO Sec2BPO Sec3BPO Sec4BPO Sec1IT Sec2IT Sec3IT Sec4IT
-----------------------------------------------------------------------
2000.89 7001.78 10001.78 6000.89 6002.67 2700.89 8001.78 5001.78
要查看它是否正常工作,请转到Data.SE查询
注意我使用了一个表变量而不是表,因为createtable在Data.SE上不起作用
输出
;WITH CTE AS (
select
Department,
[Sec1] ,
[Sec2] ,
[Sec3] ,
[Sec4]
from (select Section, Department, salesamount
from @newtest) as Sourcetable
PIVOT( SUM([salesamount])
FOR [Section] IN ([Sec1],[Sec2],[Sec3],[Sec4]) ) AS Pivottable
)
SELECT
a.sec1 Sec1bpo, a.sec2 sec2bpo, a.sec3 sec3bpo, a.sec4 sec4bpo,
b.sec1 Sec1it, b.sec2 sec2it, b.sec3 sec3it, b.sec4 sec4it
FROM
cte a, cte b
WHERE
a.department = 'BPO' and B.department = 'it'
您可以尝试以下方法:
Sec1bpo sec2bpo sec3bpo sec4bpo Sec1it sec2it sec3it sec4it
------- ------- -------- ------- ------- ------- ------- -------
2000.89 7001.78 10001.78 6000.89 6002.67 2700.89 8001.78 5001.78
select Sec1BPO,
Sec2BPO,
Sec3BPO,
Sec4BPO,
Sec1IT,
Sec2IT,
Sec3IT,
Sec4IT
from (select Section + Department AS SectDept, salesamount
from newtest) as Sourcetable
PIVOT( SUM([salesamount])
FOR SectDept IN (Sec1BPO, Sec2BPO, Sec3BPO, Sec4BPO,
Sec1IT, Sec2IT, Sec3IT, Sec4IT) ) AS Pivottable
ORDER BY 1
更新 只需提醒一句——上述解决方案在一般情况下应用时,可能会使您面临将不打算这样做的数据汇总在一起的风险。也就是说,以您当前的示例为例,如果它包含同时包含
Sec1
、BPO
和Sec1B
、PO
的行,作为部分
和部门
的组合,那么这两个组合最终将被连接为Sec1BPO
,并因此加在一起,这显然是错误的
因此,在连接部件以排除此类重复项时,可能应该使用一些分隔符,如空格或已知的其他字符,这些字符肯定不会出现在要连接的值中。我的意思是这样的:
Sec1bpo sec2bpo sec3bpo sec4bpo Sec1it sec2it sec3it sec4it
------- ------- -------- ------- ------- ------- ------- -------
2000.89 7001.78 10001.78 6000.89 6002.67 2700.89 8001.78 5001.78
select Sec1BPO,
Sec2BPO,
Sec3BPO,
Sec4BPO,
Sec1IT,
Sec2IT,
Sec3IT,
Sec4IT
from (select Section + Department AS SectDept, salesamount
from newtest) as Sourcetable
PIVOT( SUM([salesamount])
FOR SectDept IN (Sec1BPO, Sec2BPO, Sec3BPO, Sec4BPO,
Sec1IT, Sec2IT, Sec3IT, Sec4IT) ) AS Pivottable
ORDER BY 1
(感谢@Conrad Frix提出这个问题。)+1当然是要走的路,但您可能需要注意的是,
Section+Department
可能会导致某些数据的正确性问题。添加分隔符Section+'|'+Department
可以解决that@Conrad弗里克斯:你说得对。我根本没有想到这个想法,因为OP的例子似乎不能引起这样的问题。不过,我们还是应该增加警惕,现在已经做到了。谢谢你的来信。