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

これは、PIVOT を試みる前に、SQL クエリが表示するものです。

4

1 に答える 1

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 を参照してください

于 2012-11-09T15:12:29.447 に答える