来自 select sql 的动态列名
Dynamically column names from select 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 来完成这项工作,但无法完成。日期是动态的,具体取决于数据库中的日期。我正在寻找的输出如下所示。有人可以指出我正确的方向吗?
看看 fiddle 目前为止我尝试过的方法,我知道它现在正在使用 SUM,这是不正确的,但我不知道要使用什么。 http://sqlfiddle.com/#!3/0bd0c/4
PS。数据和图像没有关系,所以不要被图像所迷惑。这只是一个例子
这是您要找的吗:
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;
根据需要在 fiddle return 行中进行更改。
这样试试:
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);
我的数据库输出了以下数据
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 来完成这项工作,但无法完成。日期是动态的,具体取决于数据库中的日期。我正在寻找的输出如下所示。有人可以指出我正确的方向吗?
看看 fiddle 目前为止我尝试过的方法,我知道它现在正在使用 SUM,这是不正确的,但我不知道要使用什么。 http://sqlfiddle.com/#!3/0bd0c/4
PS。数据和图像没有关系,所以不要被图像所迷惑。这只是一个例子
这是您要找的吗:
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;
根据需要在 fiddle return 行中进行更改。
这样试试:
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);