1

Ok。一時テーブルで表されるデータがあるとします。

create table temp
 (
     ID varchar(max),
     DateTransmitted datetime,
     tagname varchar(max),
     Operator varchar(max),
     Tanknumber varchar(max),
     value float
  )

insert into temp values ( '1gk','2012-01-01 00:00:00.000','TI|A','bob','TK1',   1000.00)    
insert into temp values ('1gk', '2012-01-01 00:00:00.000','TI|B','bob','TK1',  500.00)    
insert into temp values ( '1gk','2012-01-01 00:00:00.000','TI|C','bob','TK1',  800.00)    
insert into temp values ( '2gk','2012-01-01 00:00:00.000','TI|D','bob','TK1',  700.00)    
insert into temp values ( '1gk','2012-01-01 00:00:02.000','TI|E','bob','TK1', 1100.00)    
insert into temp values ( '1gk','2012-01-01 00:00:01.000','TI|F','bob','TK1', 1100.00)

次の動的SQLでデータを変換できます。

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.tagname) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT 
operator, DateTransmitted, tanknumber,' + @cols + ' from 
            (
                select ID
                    ,DateTransmitted
                    ,operator
                    ,Tanknumber
                    , value
                    , tagname
                from temp
           ) x
            pivot 
            (
                 max(value)
                for tagname in (' + @cols + ')
            ) p '

execute(@query)

drop table temp

問題は、一時テーブルへの最後の 2 つのエントリにあります。日付が異なります。データは関連しており、実際にはデータのグループごとに ID が異なるため、同じ行に表示する必要があります。私の質問は、どうすればこのクエリの結果が 2 行になるのかということです。1 つは ID '1gk' のデータで、もう 1 つは '2gk' のデータで、各 ID のデータの平均または最小 (どちらか簡単な方) のタイムスタンプです。

IE 1gk には次のデータがあります

値 ('1gk','2012-01-01 00:00:00.000','TI|A','bob','TK1', 1000.00)

値 ('1gk', '2012-01-01 00:00:00.000','TI|B','bob','TK1', 500.00)

値 (「1gk」、「2012-01-01 00:00:00.000」、「TI|C」、「ボブ」、「TK1」、800.00)

値 (「1gk」、「2012-01-01 00:00:00.000」、「TI|E」、「ボブ」、「TK1」、1100.00)

値 ('1gk','2012-01-01 00:00:00.000','TI|F','bob','TK1', 1100.00)

4

1 に答える 1

0

DateTransmitted各 IDについて、ピボット関数に渡されるすべての値が等しいことを確認する必要があります。これは、次のようなものを使用して行うことができます。

DateTransmitted = MIN(DateTransmitted) OVER(PARTITION BY ID)

ロジックが各 ID の最初の DateTransmitted を必要とする場合、そうでない場合は、必要に応じて集計を変更できます。

したがって、クエリは次のようになります。

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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.tagname) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

set @query = 'SELECT 
operator, DateTransmitted, tanknumber,' + @cols + ' from 
            (
                select ID
                    ,DateTransmitted = MIN(DateTransmitted) OVER(PARTITION BY ID)
                    ,operator
                    ,Tanknumber
                    , value
                    , tagname
                from temp
            ) x
            pivot 
            (
                    max(value)
                for tagname in (' + @cols + ')
            ) p ';

execute(@query);

SQL-Fiddle の例

于 2013-06-20T10:19:45.073 に答える