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 に答える