Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 平均给定时间的值,并生成数据透视表_Sql Server_Pivot - Fatal编程技术网

Sql server 平均给定时间的值,并生成数据透视表

Sql server 平均给定时间的值,并生成数据透视表,sql-server,pivot,Sql Server,Pivot,我有一张这样的桌子: time | sensor | value | --------------------------- 10:00:00 | 1 | 12.3 | 10:00:00 | 2 | 14.3 | 10:00:00 | 3 | 15.3 | 10:00:01 | 1 | 15.3 | 10:00:02 | 2 | 11.3 | 10:00:01 | 3 | 10.3 | 10:00:03 | 1

我有一张这样的桌子:

time     | sensor | value |
---------------------------
10:00:00 | 1      |  12.3 |
10:00:00 | 2      |  14.3 |
10:00:00 | 3      |  15.3 |
10:00:01 | 1      |  15.3 |
10:00:02 | 2      |  11.3 |
10:00:01 | 3      |  10.3 |
10:00:03 | 1      |   9.3 |
10:00:03 | 2      |  15.3 |
10:00:04 | 3      |  11.3 |
...
10:05:01 | 1      |  15.3 |
10:05:02 | 2      |  11.3 |
10:05:01 | 3      |  10.3 |
10:05:03 | 1      |   9.3 |
10:05:03 | 2      |  15.3 |
10:05:04 | 3      |  11.3 |
我需要一个数据透视表,其中测量值按时间间隔(比如一分钟)平均,并按传感器排序:

time     | sensor 1| sensor 2| sensor 3|
----------------------------------------
10:00:00 |   11    |    12   |    10   |
10:01:00 |   10    |    13   |    15   |
...
我在MySQL中学会了如何做到这一点,但现在我不得不使用SQL Server,显然这与MySQL完全不同

任何帮助都是感激的,一些非琐碎的教程也会很有帮助

编辑

在Giorgi Nakeuri回复后尝试:

DECLARE @cols VARCHAR(MAX)

SELECT STUFF((SELECT '],[' + CAST([Group] AS VARCHAR(10)) FROM tblGroups
GROUP BY [Group]
FOR XML PATH('')), 1, 2, '') + ']'

DECLARE @s VARCHAR(MAX) = 'with cte as(
    SELECT tblData.Timestmp, tblSeries.GroupID as SensorID, tblData.SeriesID, tblData.DataValue
    FROM tblData 
    INNER JOIN tblSeries ON tblData.SeriesID = tblSeries.SeriesID

    WHERE (tblSeries.[SeriesName] = ' + 'ActivePower' 
            + 'AND tblData.Timestmp > ' + '2015-02-05 00:00:00' + ' AND  tblData.Timestmp < ' + '2015-02-05 23:59:59'
            + 'AND tblData.DataValue>100)
)
select * from cte
pivot(AVG(DataValue) for GroupID in(' + @cols + ' )) p'


EXEC(@s)
这是传感器ID,但不是透视表…

尝试以下操作:

select * from someTable
pivot(AVG(value) for sensor in([1],[2],[3])) p
如果表中显示了更多列,则:

with cte as(select time, sensor, value from someTable)
select * from cte
pivot(AVG(value) for sensor in([1],[2],[3])) p
动态版本:

DECLARE @cols VARCHAR(MAX) = '' 

SELECT @cols = STUFF((SELECT '],[' + CAST([Group] AS VARCHAR(10)) FROM tblGroups 
WHERE [Group] <> 'meteo' 
GROUP BY [Group] 
FOR XML PATH('')), 1, 2, '') + ']' 

DECLARE @s VARCHAR(MAX) = 'with cte as( 
SELECT DATEADD(mi, datediff(mi, 0, tblData.Timestmp), 0) Timestmp, tblSeries.GroupID as SensorID, tblData.DataValue 
FROM tblData INNER JOIN tblSeries ON tblData.SeriesID = tblSeries.SeriesID 
WHERE tblSeries.[SeriesName] = ' + '''ActivePower''' + ' AND tblData.Timestmp > ''' + '2015-02-05 00:00:00''' + ' 
AND tblData.Timestmp < ' + '''2015-02-05 23:59:59''' + ' AND tblData.DataValue>100 
) 
select * from cte 
pivot(AVG(DataValue) for GroupID in(' + @cols + ' )) p' 

EXEC( @s)

如何自动生成列表[1]、[2]、[3]?我可以只使用Select语句吗?因为在现实生活中,我有成百上千的传感器。你想得到柱的手簧片吗?是的,没问题。谢谢你的回答,我试过了,但有些东西还不正确。@SantiPeñate Vera,您的表中有3行以上的行吗?请尝试使用+和tblData.Timestmp>2015-02-05 00:00:00和tblData.Timestmp<2015-02-05 23:59:59'也将其更改为“tblSeries.[SeriesName]=ActivePower”+,而不是exec@s打印@s并查看您是否正确构造了查询
DECLARE @cols VARCHAR(MAX) = '' 

SELECT @cols = STUFF((SELECT '],[' + CAST([Group] AS VARCHAR(10)) FROM tblGroups 
WHERE [Group] <> 'meteo' 
GROUP BY [Group] 
FOR XML PATH('')), 1, 2, '') + ']' 

DECLARE @s VARCHAR(MAX) = 'with cte as( 
SELECT DATEADD(mi, datediff(mi, 0, tblData.Timestmp), 0) Timestmp, tblSeries.GroupID as SensorID, tblData.DataValue 
FROM tblData INNER JOIN tblSeries ON tblData.SeriesID = tblSeries.SeriesID 
WHERE tblSeries.[SeriesName] = ' + '''ActivePower''' + ' AND tblData.Timestmp > ''' + '2015-02-05 00:00:00''' + ' 
AND tblData.Timestmp < ' + '''2015-02-05 23:59:59''' + ' AND tblData.DataValue>100 
) 
select * from cte 
pivot(AVG(DataValue) for GroupID in(' + @cols + ' )) p' 

EXEC( @s)