1

我目前使用 Linq-2-Sql 来执行相当复杂的查询。然而,它的效率非常低,并导致对服务器进行多次往返。

使用一些连接,我设法将数据转换为如下格式:

Sensor -- Timestamp        -- Value
A      -- 12/02/2013 09:00 -- 10.4
A      -- 12/02/2013 10:00 -- 10.3
A      -- 12/02/2013 11:00 -- 10.1
B      -- 12/02/2013 09:00 -- 15.3
B      -- 12/02/2013 10:00 -- 16.4
B      -- 12/02/2013 11:00 -- 15.4

我希望这样的输出

TimeStamp        -- SensorA -- SensorB
12/02/2013 09:00 -- 10.4    -- 15.3
12/02/2013 10:00 -- 10.3    -- 16.4
12/02/2013 11:00 -- 10.1    -- 15.4

我猜我需要一个动态支点?有人可以帮我指出正确的方向吗?

编辑- 显然有超过 2 个传感器......理想情况下,我需要这个能够按列扩展。我什至不知道 SQL Server 是否可以做到这一点,因此不胜感激。

4

1 回答 1

2

您将需要使用该PIVOT函数来转换数据。

如果您的值数量有限Sensor,则可以对查询进行硬编码:

select *
from
(
  select sensor, timestamp, value
  from yourtable
) src
pivot
(
  max(value)
  for sensor in (A, B)
) piv

请参阅带有演示的 SQL Fiddle

但如果值未知,那么您将需要实现动态 SQL:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Sensor) 
                    from yourtable  -- table containing Sensor values
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT timestamp, ' + @cols + ' from 
             (
                select sensor, timestamp, value
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for sensor in (' + @cols + ')
            ) p '

execute(@query)

请参阅带有演示的 SQL Fiddle

两者都会给出结果:

|           TIMESTAMP |    A |    B |
-------------------------------------
| 2013-12-02 09:00:00 | 10.4 | 15.3 |
| 2013-12-02 10:00:00 | 10.3 | 16.4 |
| 2013-12-02 11:00:00 | 10.1 | 15.4 |

请注意,您将用yourtable当前查询替换 。

编辑#1,如果要按日期过滤,可以使用以下动态 sql:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @startdate datetime,
    @enddate datetime

set @startdate = '2013-12-01'
set @enddate = '2013-12-03'

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Sensor) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT timestamp, ' + @cols + ' from 
             (
                select sensor, timestamp, value
                from yourtable
                where timestamp >= '''+convert(varchar(10), @startdate, 120)+'''
                  and timestamp <= '''+convert(varchar(10), @enddate, 120)+'''
            ) x
            pivot 
            (
                max(value)
                for sensor in (' + @cols + ')
            ) p '


execute(@query)

请参阅带有演示的 SQL Fiddle

于 2013-02-12T11:27:54.867 回答