2012-02-10 3 views
0

개월이 + 년 열의 I 2008 SQL 서버에서이 테이블 구조를 가지고 : 123, 0.1, 0.0, 0.5, ..... 0.7, 2008TSQL UNPIVOT은 날짜

그래서 기본적으로 나는 한 달에 한 번, 그리고 한 해에 한 번 열을 가지고 있습니다.

행에는 그 해의 각 달에 대한 선량 값이 들어 있습니다.

내 원하는 출력은 다음과 같습니다

열 : PersonId, BEGINDATE, 종료 날짜, 용량

BEGINDATE 및 종료 날짜가 DOSEx 열, 올해에서 파생 될 수

. 그럼 올해가 2008 년이라면 DOSE1 열은 2008 년 1 월 1 일 시작일을 지정합니다. 종료일은 31/01/2008 23:59입니다.

DOSE4의 경우 4 월이므로 BeginDate는 2008 년 1 월 4 일 및 EndDate 30/04/2008 23:59

TSQL을 사용하여 이것을 달성하는 방법은 무엇입니까? 나는 UNPIVOT을 사용해야한다는 의혹이 있지만 거기에 도착하는 방법을 잘 모릅니다.

도움을 주시면 감사하겠습니다.

감사합니다,

TJ이 작동합니다

+0

을 그리고 당신은 BEGINDATE 및 ENDDATE 계산하는 방법을 자세히 설명 할 수 있습니까? – Arion

답변

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

+0

@tjeuten - 다행이었습니다. 어쨌든'YYYYMMDD '형식은 로케일, ISO 및 애매하지 않은 유일한'VARCHAR '날짜 형식입니다. – Lamak

+0

사실 통찰력에 감사드립니다. – tjeuten