2013-06-20 63 views
1

好的。假設我有臨時表所代表的數據。SQL Pivot將行轉換爲列

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實際上是不同的。我的問題是如何結束這個查詢給出兩行的結果。 1與id'1gk'的數據和另一個與'2gk'的數據at和平均或最小(哪一個更容易)時間戳每個ID的數據。

IE 1gk將具有以下數據

值( '1gk', '2012-01-01 00:00:00.000', 'TI | A', '鮑勃', 'TK1',1000.00 )

值( '1gk', '2012-01-01 00:00:00.000', 'TI | B', '鮑勃', 'TK1',500.00)

值( '1gk', '2012-01-01 00:00:00.000','TI | C','bob','TK1',800.00)

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

值( '1gk', '2012-01-01 00:00:00.000', 'TI | F', '鮑勃', 'TK1',1100.00)

+0

是什麼讓那些相關的兩個記錄?什麼是確切的確定性規則?我們是否可以放棄'DateTransmited'的時間部分? – peterm

+0

這兩個記錄在這種情況下'1gk'與記錄組的唯一標識符相關。 IE沒有其他數據會有ID'1gk'。傳輸日期的時間部分不能簡單地如上所述,我希望得到的最小DateTransmitted爲組是DateTransmitted。 – BLITZCLIPSE

+0

你正在使用什麼數據庫系統? –

回答

0

你需要確保每個ID如需要

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

如果你的邏輯是,你要在第一DateTransmitted每個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); 

Example on SQL-Fiddle