我确信这是一个简单的技巧,尽管到目前为止我还找不到答案!
我有过
TIMESTAMP | POINTNAME | VALUE
2012-10-10 16:00:00 AHU01 20
2012-10-10 16:00:00 AHU02 25
2012-10-10 16:00:15 AHU01 26
2012-10-10 16:00:15 AHU02 35等等。(适用于约800点)
对于许多点名称,我不想在pivot 'FOR‘(如下所给的语法)定义的' in’子句中列出每个点名称,但我想使用子查询。
所以我想要的是所有的POINTNAME值都是带有时间戳和值列的列,所以我会得到一个时间戳值和许多列,每个POINTNAME每个时间戳只有一个值,所以我不需要聚合任何东西,所以无论如何都要选择max?
类似于:
SELECT [TIMESTAMP] FROM ( SELECT * FROM POINT_TABLE)
PIVOT( Max[Value] FOR [POINTNAME] IN (SELECT DISTINCT [POINTNAME] FROM POINT_TABLE)会产生-
TIMESTAMP AHU01 AHU02
2012-10-10 16:00:00 20 25
2012-10-10 16:15:00 26 35我意识到这可能不是这么简单,但希望你能理解我想要实现的目标?
透视语法:
SELECT <non-pivoted column>,
[first pivoted column] AS <column name>,
[second pivoted column] AS <column name>,
...
[last pivoted column] AS <column name>
FROM
(<SELECT query that produces the data>)
AS <alias for the source query>
PIVOT
(
<aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;发布于 2012-11-06 14:18:31
对于动态列数,必须使用动态SQL
declare
@cols nvarchar(max),
@stmt nvarchar(max)
select @cols = isnull(@cols + ', ', '') + '[' + T.POINTNAME + ']' from (select distinct POINTNAME from TABLE1) as T
select @stmt = '
select *
from TABLE1 as T
pivot
(
max(T.VALUE)
for T.POINTNAME in (' + @cols + ')
) as P'
exec sp_executesql @stmt = @stmthttps://stackoverflow.com/questions/13245364
复制相似问题