从select sql动态列名

Poc*_*hen 5 sql sql-server pivot sql-server-2008

我从我的数据库输出以下数据

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
Run Code Online (Sandbox Code Playgroud)

我试图找出如何使用PIVOT表来使这项工作,但不能使它工作.日期是动态的,具体取决于数据库中的日期.我正在寻找的输出如下.有人可以指点我正确的方向吗?

看看我到目前为止尝试过的小提琴我知道它现在正在使用SUM,这是不正确的,但我无法弄清楚要使用什么.http://sqlfiddle.com/#!3/0bd0c/4

需要输出

PS.数据和图像不相关,因此不要被图像欺骗.这只是一个例子

Mih*_*scu 9

这是你在寻找的东西:

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;
Run Code Online (Sandbox Code Playgroud)

在你的小提琴中改变它会在你需要的时候返回行.


Shn*_*ugo 5

像这样尝试:

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);
Run Code Online (Sandbox Code Playgroud)