我有以下使用PIVOT命令的基本SQL语句。
SELECT *
FROM
(
--select statement that creates my dataset
) s
PIVOT (Max(incidentcount) for dept in ([dept1],[dept2])) p
这就是我期望它做的事情,它为我提供了一些事件的计数,其中depts作为我的列。我的问题是我用于列的部门是1-60。
无论如何,我可以告诉查询使用列Department
来填充PIVOT in
部分。显然我想避免手动输入每个部门。
修改
这是创建我在数据透视表中使用的数据集的SQL ...
SELECT Details, Department , count(*) NoIncidents
FROM myincidentdb
Group by Details, Department
编辑2
答案 0 :(得分:5)
您需要使用动态sql来PIVOT
这个,您的代码将类似于:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(dept)
from yourtablewithDepartments
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT *
from
(
<your query goes here>
) src
pivot
(
max(incidentcount)
for dept in (' + @cols + ')
) piv '
execute(@query)
如果您发布更多详细信息,例如表格结构等,那么可以对其进行改进以满足您的需求。
根据您当前的查询进行编辑,看起来您可以使用以下内容:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(department)
from myincidentdb
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Details, ' + @cols + '
from
(
select Details, Department
from myincidentdb
) x
pivot
(
count(Department)
for Department in (' + @cols + ')
) p '
execute(@query)