関数を使用し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 を参照してください