답변 주신 건우아빠님께 감사드립니다.
덕분에 프로시저의 소스가 될 Customer_S 테이블을 만들 수 있게 되었습니다.
엑셀업로드 양식자체가 횡으로 되어 있습니다만 해당 내용을 각각 일자별로 수정할 수 있어야하고
해당 일자가 하루도 빠짐없이 매일 기록되어야 하기 때문에 업로드시 횡을 종으로 변경하여 디비화하고
해당 테이블을 프로시저를 통하여 날짜계산을 통해 다시 횡으로 보여주게 끔 구현하기 위해 본 질문을 드렸었습니다.
다시 한번 영감을 주신 건우아빠님께 감사의 말씀 전합니다.
Day1 | Day2 | Day3 | Day4 | Day5 | Day6 | Day7 | Day8 | Day9 | Day10 | Day11 | Day12 | Day13 | Day14 |
212 | 188 | 196 | 160 | 92 | 0 | 156 | 44 | 0 | 0 | 0 | 0 | 0 | 0 |
안녕하세요. 프로시저를 짜기 위해서 노력해봤으나 내공이 부족하여 고민하던 차에 이렇게 SQLER에 질문을 드립니다.
간단히 설명드리자면 위와 같이 일자별 횡으로 데이터가 존재하는 테이블을 읽어들여
아래와 같이 일자별 데이터만 종으로 바꿔서 새 테이블에 저장하는 프로시저를 만들려고 합니다.
Day1 | 212 |
Day2 | 188 |
Day3 | 196 |
Day4 | 160 |
Day5 | 92 |
Day6 | 0 |
Day7 | 156 |
Day8 | 44 |
Day9 | 0 |
Day10 | 0 |
Day11 | 0 |
Day12 | 0 |
Day13 | 0 |
Day14 0 |
기존에 존재하는 소스가 될 Customer_T 테이블입니다. 엑셀로 수시로 업로드 되는 테이블이구요.
DateCreated 컬럼의 값은 모든 ROW가 동일합니다. 즉 시작날짜는 모든 ROW가 동일합니다.
엑셀 업로드 할때마다 데이터가 전부 지워지고 시작날짜는 변경되어 다른 데이터들이 업로드 됩니다.
위의 Customer_T 테이블에 엑셀 업로드된 데이터를 가지고 아래와 같은 Customer_S 테이블을 만드려고 합니다.
보시는 바와 같이 stock 컬럼까지는 반복되며 일자별만 종으로 바꾸는 거라 row수가 대단히 많아 지는 것이 정상입니다.
기존 테이블에 DateCreated 컬럼 값이 2013-03-05이면 아래 Customer_S 테이블은 2013-03-05일부터 +13일까지 총 2주간의
데이터가 생성되며 DateCreated 컬럼값이 2013-11-10이면 아래 Customer_S 테이블은 2013-11-10부터 총 +13일까지 2주간의
데이터가 업데이트 되게 해야 하는데요 감을 못잡겠습니다 ㅋ
CustomerOutTDayId | CustomerNo | DeliverNo | PartNo | Unit | Stock | DayQty | DateCreated | Flag | DateCreated 설명 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 212 | 2013-03-05 | 1 | 시작날짜 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 188 | 2013-03-06 | 1 | 시작날짜 +1 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 196 | 2013-03-07 | 1 | 시작날짜 +2 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 160 | 2013-03-08 | 1 | 시작날짜 +3 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 92 | 2013-03-09 | 1 | 시작날짜 +4 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 0 | 2013-03-10 | 1 | 시작날짜 +5 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 156 | 2013-03-11 | 1 | 시작날짜 +6 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 44 | 2013-03-12 | 1 | 시작날짜 +7 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 0 | 2013-03-13 | 1 | 시작날짜 +8 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 0 | 2013-03-14 | 1 | 시작날짜 +9 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 0 | 2013-03-15 | 1 | 시작날짜 +10 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 0 | 2013-03-16 | 1 | 시작날짜 +11 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 0 | 2013-03-17 | 1 | 시작날짜 +12 |
1 | KO16000 | KR16000A | DW466 | 56 | 0 | 0 | 2013-03-18 | 1 | 시작날짜 +13 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 236 | 2013-03-05 | 1 | 시작날짜 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 396 | 2013-03-06 | 1 | 시작날짜 +1 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 348 | 2013-03-07 | 1 | 시작날짜 +2 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-08 | 1 | 시작날짜 +3 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-09 | 1 | 시작날짜 +4 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 352 | 2013-03-10 | 1 | 시작날짜 +5 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 276 | 2013-03-11 | 1 | 시작날짜 +6 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 188 | 2013-03-12 | 1 | 시작날짜 +7 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-13 | 1 | 시작날짜 +8 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-14 | 1 | 시작날짜 +9 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-15 | 1 | 시작날짜 +10 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-16 | 1 | 시작날짜 +11 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-17 | 1 | 시작날짜 +12 |
2 | KO16000 | KR16000B | DW484 | 42 | 0 | 0 | 2013-03-18 | 1 | 시작날짜 +13 |
중략 | |||||||||
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 541 | 2013-03-05 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 694 | 2013-03-06 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 403 | 2013-03-07 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 956 | 2013-03-08 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 0 | 2013-03-09 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 0 | 2013-03-10 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 935 | 2013-03-11 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 1118 | 2013-03-12 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 618 | 2013-03-13 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 116 | 2013-03-14 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 0 | 2013-03-15 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 0 | 2013-03-16 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 0 | 2013-03-17 | 1 | |
6 | KO12000 | KR12003A | HD1076 | 99 | 3663 | 0 | 2013-03-18 | 1 |
Comment 2
-
건우아빠
2013.11.18 13:50
-
하이페츠
2013.11.18 14:52
오 안녕하십니까. 건우아빠님.
정말 오랜만입니다! 그간 잘 지내셨습니까?
이번에도 어김없이 무지한 저를 깨우쳐 주시는 건우바빠님께 감사의 말씀을 드립니다.
알려주신 부분 중 with절 안에 select 1CustomerOutTDayId ,'KO16000' CustomerNo,'KR16000A' DeliverNo,'DW466' PartNo
,56 Unit,0 Stock ,212 day1,188 day2 ,196 day3,160 day4 ,92 day5 ,0 day6,156 day7,44 day8,0 day9,0 day10,0 day11,0 day12,0 day13,0 day14 , '2013-10-05' DateCreated union all
select 2 ,'KO16000' ,'KR16000B' ,'DW484' ,42 ,0 ,236 ,396 ,348 ,0 ,0 ,352 ,276 ,188 ,0 ,0 ,0 ,0 ,0 ,0 , '2013-10-05' DateCreated )요 부분만 Customer_T 테이블로 변경하니 원하던대로 값이 아주 잘 나오네요.
이렇게 간단하게 해결할 수 있는 걸 프로시저에서 이중 루프 돌려가며 계산하려 했던 제가 참으로 어리석게 느껴집니다.
다시 한번 건우아버지님의 내공과 친절에 감탄하며 오늘도 공수를 줄여봅니다.
곧이어 이걸 다시 오늘 날짜를 자동계산하여 횡으로 출력해주는 프로시저에 대해 문의드릴까 합니다.
그럼 커피 타임 후 다시 뵙겠습니다.
------------ 추가 -----------------------------------------------------------------------------
이 질문을 드린 궁긍적인 목적을 새로운 질문 사항으로 올렸습니다.
저같은 경험과 지식이 부족한 유저에겐 매우 어려운 문제이지만
아마도 건우아빠님과 같은 내공이 출중하신 분들은 어렵지 않게 해결하지 않을까 생각됩니다! ^^;
그럼 염치없지만 한 줄기 광명의 빛을 보여주시면 고맙겠습니다!!!
하이패츠님 오랜만이네요...
unpivot 을 이용하시면 원하시는걸 쉽게 구현 가능 합니다...
with res as
(
select 1CustomerOutTDayId ,'KO16000' CustomerNo,'KR16000A' DeliverNo,'DW466' PartNo
,56 Unit,0 Stock ,212 day1,188 day2 ,196 day3,160 day4 ,92 day5 ,0 day6,156 day7,44 day8,0 day9,0 day10,0 day11,0 day12,0 day13,0 day14 , '2013-10-05' DateCreated union all
select 2 ,'KO16000' ,'KR16000B' ,'DW484' ,42 ,0 ,236 ,396 ,348 ,0 ,0 ,352 ,276 ,188 ,0 ,0 ,0 ,0 ,0 ,0 , '2013-10-05' DateCreated )
select CustomerOutTDayId, CustomerNo, DeliverNo, PartNo, Unit, Stock, DateCreated, substring(daygubun,4,2)
, DATEADD(dd, convert(int, substring(daygubun,4,2)) - 1 , DateCreated ) NewDateCreated
, DayQty
from res
unpivot
(
DayQty for daygubun in
( day1, day2, day3 ,day4 ,day5 ,day6 ,day7 ,day8 ,day9 ,day10 ,day11 ,day12, day13, day14
)
) as unpvt