web-dev-qa-db-ja.com

選択したSQLからの動的な列名

データベースから次のデータ出力があります

Observation             1   aug -2015
Improvement suggestion  1   dec -2015
Observation             1   dec -2015
Accident                2   jan -2016
Non Conformity          5   jan -2016
Observation             5   jan -2016

この作業を行うためにPIVOT-tableを使用する方法を理解しようとしましたが、機能させることができません。日付は、データベースの日付に応じて動的です。私が探している出力は次のようなものです。誰かが私を正しい方向に向けることができますか?

私がこれまでに試したことのフィドルを見ると、今はSUMを使用していることがわかります。それは正しくありませんが、何を使用するのかわかりません。 http://sqlfiddle.com/#!3/0bd0c/4

Output needed

PS。データと画像は関連していないので、画像に騙されないでください。あくまでも一例です

5
Pochen

これはあなたが探していたものですか?

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(ColumnName) 
    from tempData
    group by ColumnName, name
FOR XML PATH(''), Type
).value('.', 'NVARCHAR(MAX)') 
,1,1,'')

set @query = N'SELECT Name, ' + @cols + N' from 
 (
    select Name, value, ColumnName
    from tempData
) x
pivot 
(
    SUM(value)
    for ColumnName in (' + @cols + N')
) p '

exec sp_executesql @query;

これをフィドルで変更すると、必要に応じて行が返されます。

9

このようにしてみてください:

DECLARE @cols AS NVARCHAR(MAX)=
STUFF(
(
    SELECT DISTINCT ',[' + ColumnName + ']'
    FROM tempData
    FOR XML PATH('')
)
,1,1,'');

DECLARE @SqlCmd VARCHAR(MAX)=
'SELECT p.*
 FROM
 (
    SELECT *
    FROM tempData
 ) AS tbl
 PIVOT
 (
    SUM(Value) FOR ColumnName IN(' +  @cols +')
 ) AS p';

 EXEC(@SqlCmd);
3
Shnugo