2012-07-09 62 views
1

我知道互聯網上有很多數據透視表的例子,但是我對SQL很陌生,而且我遇到了一些麻煩,因爲所有例子似乎都與聚合函數有關。數據透視表故障

Table 1: 

|Date   | Tag |Value | 
|06/10 2:00pm | A | 65 | 
|06/10 2:00pm | B | 44 | 
|06/10 2:00pm | C | 33 | 
|06/10 2:02pm | A | 12 | 
|06/10 2:02pm | B | 55 | 
|06/10 2:02pm | C | 21 | 
.... 
|06/10 1:58am | A | 23 | 

我想它看起來就像是(表2):

|Date  | A | B | C | 
|06/10 2:00pm| 65 | 44 | 33 | 
|06/10 2:02pm| 12 | 55 | 21 | 
..... 
|06/10 1:58am| 23 | etc. | etc. | 

(抱歉格式)

是遇到一些問題(不工作與我在網上找到的代碼) 我想運行這個存儲過程(而不是一個SQL作業),每2分鐘,以便表1中的這些數據不斷被移動到表2.但我想我會需要等等每一次的日期? (多數民衆贊成我看過的語法) 數據透視表本身似乎很簡單,但日期時間一直讓我悲傷。 任何代碼snipets或鏈接將不勝感激。

謝謝。

+0

是以該格式存儲的日期嗎? '06/10 2:02 pm'日期欄上的數據類型是什麼? – Taryn 2012-07-09 20:08:37

+0

如果您有多個具有相同日期和類型的行,輸出會是什麼?例如,如果您添加'06/10 2:00 pm | A | 50'。 – 2012-07-09 20:47:03

+0

@bluefeet格式將是一個日期時間戳類似於:06-20-2012 00:02:13上午(我目前沒有格式在我面前,但那是非常接近) – akwarywo 2012-07-09 22:58:56

回答

0

樞本身似乎很簡單:

select * 
from table1 
pivot (min (Value) for Tag in ([A], [B], [C])) p 

至於存儲過程,我會用保存在表2爲表1的過濾器最後日期,但不包括不完整的組(我假定會有,在有些點,所有三個標籤都存在,並且只有最後一個日期可能不完整,否則,需要對上一個日期進行特殊處理以更新/插入一行)。

所以,在代碼:

create proc InsertPivotedTags 
as 
    set NoCount ON 
    set XACT_ABORT ON 

    begin transaction 

    declare @startDate datetime 
    -- Last date from Table2 or start of time 
    select @startDate = isnull (max ([Date]), '1753-01-01') 
     from Table2 

    insert into Table2 
    select * 
     from Table1 
    pivot (min (Value) for Tag in ([A], [B], [C])) p 
    where [Date] > @startDate 
    -- exclude incomplete groups 
     and a is not null 
     and b is not null 
     and c is not null 

    commit transaction 

如果組可以是不完整的,你應該刪除exlude過濾器,並添加一個delete語句,在情況下,它是不完全的消除最後日期,並調整@startDate三毫秒起得早再次相同的行,但現在處於更充滿狀態。