使用字段在许多列标题中进行PIVOT

时间:2012-11-09 15:09:07

标签: sql sql-server sql-server-2008 pivot

我有以下使用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

This is what my sql query shows before I attempt to PIVOT it

1 个答案:

答案 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)

请参阅SQL Fiddle with Demo