2012-02-10 47 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