2012-02-10 67 views
0

我在SQL Server 2008中此表的結構:TSQL UNPIVOT幾個月+年列日

列:是PersonID,DOSE1,DOSE2,劑量3,..... DOSE12,YEAR

例如行:123,0.1,0.0,0.5,...... 0.7,2008

所以基本上我有一個列,每個月,然後一個列年。

而行包含當年每個月的劑量值。

我所需的輸出是:

列:PERSONID,BEGINDATE,結束日期,劑量

BEGINDATE日期和結束日期將從DOSEx列,並在今年進行的。 所以說,今年是2008年,DOSE1列會給我一個01/01/2008的BeginDate結束EndDate應該是31/01/2008 23:59

對於DOSE4這是4月份,所以BeginDate應該是01/04/2008和結束日期30/04/2008 23:59

任何方式來實現這個使用TSQL?我懷疑我應該使用UNPIVOT,但不確定如何到達那裏。

任何幫助,非常感謝。

問候,

TJ

+0

你能解釋更多的BEGINDATE和結束日期如何計算? – Arion 2012-02-10 13:52:53

回答

2

這應該工作:

;WITH CTE AS 
(
    SELECT PersonId, 
      CONVERT(DATETIME,CAST([YEAR] AS VARCHAR(4))+RIGHT('0'+SUBSTRING(Months,5,2),2)+'01') BeginDate, 
      Dose 
    FROM YourTable A 
    UNPIVOT(Dose FOR Months IN (DOSE1,DOSE2,DOSE3,DOSE4,DOSE5,DOSE6,DOSE7,DOSE8,DOSE9,DOSE10,DOSE11,DOSE12)) UP 
) 

SELECT PersonId, BeginDate, DATEADD(MINUTE,-1,DATEADD(MONTH,1,BeginDate)) EndDate, Dose 
FROM CTE 
+0

謝謝! Works,我做的唯一一個小調整就是日期轉換部分,以確保它使用正確的語言環境:CONVERT(DATETIME,'1 /'+ SUBSTRING(months,5,2)+'/'+ CAST([Year ] AS VARCHAR(4)),102)AS BeginDate – tjeuten 2012-02-10 15:31:20

+0

@tjeuten - 很高興工作。在任何情況下,格式「YYYYMMDD」是唯一不依賴語言環境的「VARCHAR」日期格式,其ISO和它不含糊。 – Lamak 2012-02-10 15:34:46

+0

是真的,謝謝你的洞察力 – tjeuten 2012-02-10 15:36:49