2015-01-23 4 views
1

나는이 다음 표 :보고 달이 201,501 인 경우, Forecast_2 :SQL 선택 열 스팬 데이터 행 스팬

REPORT_MONTH FORECAST_1 FORECAST_2 FORECAST_3 FORECAST_4 FORECAST_5 FORECAST_6 FORECAST_7 FORECAST_8 FORECAST_9 FORECAST_10 FORECAST_11 FORECAST_12 
201501   23   23  14   51   25   27   28   29   36   35   12   42 
201502   24   25  26   12   4   25   26   7   8   21   4   24 

위의 기록 판매 (EX 시작 월을 기준으로 다음 십이개월의 예측 이 스키마 고려할 때 2015의 판매 예측)

년 3 월을 의미한다, 나는 다음과 같은 데이터를 선택하고 싶습니다 :

REPORT_MONTH FORECAST_MONTH FORECAST_VALUE 
201501    201502    23 
201501    201503    23 
201501    201504    14 
201501    201505    51 
201501    201506    25 
201501    201507    27 
201501    201508    28 
201501    201509    29 
201501    201510    36 
201501    201511    35 
201501    201512    12 
201501    201601    42 
201502    201503    24 
201502    201504    25 
201502    201505    26 
201502    201506    12 
201502    201507    4 
201502    201508    25 
201502    201509    26 
201502    201510    7 
201502    201511    8 
201502    201512    21 
201502    201601    4 
201502    201602    24 

을에 VARCHAR 날짜를 변환해야하는 명백한 없다면 datetime에이 가능성이 있습니까?

답변

1

아니 좋은 솔루션,하지만 당신은 union의 세트 사용할 수 있습니다

select report_month 
,  substring(convert(varchar, dateadd(month, 1 /*month nr*/, convert(date, report_month + '01', 112)), 112), 1, 6) forcast_month 
,  forecast_01 forecast_value 
from tableName 
union 
all 
select report_month 
,  substring(convert(varchar, dateadd(month, 2 /*month nr*/, convert(date, report_month + '01', 112)), 112), 1, 6) forcast_month 
,  forecast_02 forecast_value 
from tableName 

기타 등을

+0

UNION ALL이 갈 수있는 방법이지만, 당신이 놓친 몇 가지. FORECAST_MONTH를 얻기 위해 REPORT_MONTH에 열 번호를 추가하고 FROM 테이블도 누락되었습니다. – jarlh

+1

@ jarlh : 감사합니다. 당신이 옳았. 그것은 단지 몇 가지 샘플 코드였습니다. 나는 OP가 나머지 자신을 알아낼지도 모른다라고 생각했다. 그것은 개념에 관한 것이 었습니다. '내 코드 작성'이 아니 었습니다. –

+0

아니요. 이것이 작동하는지 잘 모르겠습니다. 예를 들어보고 월이 201505이면 forecast_1은 201506의 값을 나타냅니다. 위 쿼리를 사용하면 forecast_1이 어느 달을 가리키는 지 구분할 수 없습니다. – l46kok

0

당신은 더 간결 쿼리 UNPIVOT를 사용할 수 있습니다

SELECT REPORT_MONTH, FORECAST_VALUE, 
     ROW_NUMBER() OVER (PARTITION BY REPORT_MONTH ORDER BY FORECAST) AS rn 
FROM 
    (SELECT REPORT_MONTH, FORECAST_1, FORECAST_2, FORECAST_3, ...etc 
    FROM #FORECASTS) p 
UNPIVOT 
    (FORECAST_VALUE FOR FORECAST IN (FORECAST_1, FORECAST_2, FORECAST_3, ...etc))AS unpvt; 

위 쿼리에서 생성 된 출력은 다음과 같습니다.

REPORT_MONTH FORECAST_VALUE rn 
---------------------------------- 
201501   23    1 
201501   23    2 
201501   14    3 
.... 
201502   24    1 
201502   25    2 
201502   26    3 
..... 

는 이제 다른 쿼리에서 위의 쿼리를 포장하고 계산하기 위해 rn, REPORT_MONTH을 사용할 수 있습니다 FORECAST_MONTH :

SELECT REPORT_MONTH, 
     DATEADD(MONTH, rn, CONVERT(DATE, CONCAT(REPORT_MONTH, '01'))) AS FORECAST_MONTH, 
     FORECAST_VALUE 
FROM (
    SELECT REPORT_MONTH, FORECAST_VALUE, 
      ROW_NUMBER() OVER (PARTITION BY REPORT_MONTH ORDER BY FORECAST) AS rn 
    FROM 
     (SELECT REPORT_MONTH, FORECAST_1, FORECAST_2, FORECAST_3, ...etc 
     FROM #FORECASTS) p 
    UNPIVOT 
     (FORECAST_VALUE FOR FORECAST IN (FORECAST_1, FORECAST_2, FORECAST_3, ...etc))AS unpvt 
) t 

출력 :

REPORT_MONTH FORECAST_MONTH FORECAST_VALUE 
---------------------------------------------- 
201501   2015-02-01  23 
201501   2015-03-01  23 
201501   2015-04-01  14 
... etc 
201502   2015-03-01  24 
201502   2015-04-01  25 
201502   2015-05-01  26 
... etc