1

我有以下使用 PIVOT 命令的基本 SQL 语句。

SELECT *
FROM

(
--select statement that creates my dataset 
) s

PIVOT (Max(incidentcount) for dept in ([dept1],[dept2])) p

这符合我的预期,它为我提供了每个原因的事件计数,并以部门作为我的专栏。我的问题是我用于列的部门从 1 到 60。无论如何我可以告诉查询使用该列Department来填充该PIVOT in部分。显然我想避免手动输入每个部门。

编辑

这是创建我在数据透视表中使用的数据集的 sql...

SELECT Details, Department , count(*) NoIncidents
  FROM myincidentdb
  Group by Details,  Department

编辑 2

这是我的 sql 查询在我尝试 PIVOT 之前显示的内容

4

1 回答 1

5

您将需要PIVOT对此使用动态 sql,您的代码将与此类似:

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

于 2012-11-09T15:12:29.447 回答