MSSQL 2012 행을 열로 변경 하려고 합니다.
아래 1번 테이블이 조회한 테이블이고 2번 테이블이 변경하고 싶은 모양 입니다. 실제로는 양이 많은 데이터 입니다.
조회 되는 데이터가 날짜라서 고정되어 있지않고 변경되어 case나 pivot은 사용 못할 것 같습니다.
도움 부탁 드립니다. 감사합니다.
1. 조회 테이블
EditDate | MachCD | MachNM | TMP |
20170701 | 11-A | 200-02 | 0.3 |
20170701 | 11-A | 200-03 | 0.5 |
20170702 | 06-A | 600-26 | 0.7 |
20170702 | 06-A | 600-27 | 0.7 |
20170703 | 01-A | 600-5 | 0.7 |
20170703 | 01-A | 600-6 | 0.7 |
20170703 | 07-A | 500-1 | 0.9 |
20170704 | 11-A | 200-03 | 1.67 |
20170705 | 01-A | 600-5 | 0.7 |
20170705 | 01-A | 600-6 | 0.7 |
20170706 | 01-A | 600-5 | 0.7 |
20170706 | 01-A | 600-6 | 0.7 |
20170707 | 01-A | 600-5 | 0.7 |
20170707 | 01-A | 600-6 | 0.7 |
2. 변경할 테이블 모양
20170701 | 20170702 | 20170703 | 20170704 | 20170705 | 20170706 | 20170707 | ||
11-A | 200-02 | 0.3 | ||||||
11-A | 200-03 | 0.5 | 1.67 | |||||
06-A | 600-26 | 0.7 | 0.7 | 0.7 | 0.7 | |||
06-A | 600-27 | 0.7 | 0.7 | 0.7 | 0.7 | |||
01-A | 600-5 | 0.7 | ||||||
01-A | 600-6 | 0.7 | ||||||
07-A | 500-1 | 0.9 |
Comment 3
-
Terry
2017.07.17 18:30
-
이리
2017.07.18 11:58
dynamic pivot으로 해보시는게..
-
톡히슈터
2017.07.19 11:16
동적 pivot 이용해보세요
것도 아니면 날짜의 값을 배열에 저장해두고 pivot시 매칭시켜서 하시는 방법도 있습니다.
비슷한 답변이 있는데 참고해보세요.
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=10205&docId=221319097&page=1#answer2 두번째 답변입니다.
성능은 보장못합니다.. 유사한 형태의 출력물을 개발 및 현재 유지보수중이라
제가 진행했던 방법 공유드리는 것이니
참고만 하시면 될 듯 합니다.
1. SP로 작성 ( 아규먼트는 시작일자 종료일자?? )
2. 임시테이블 생성
(gubn,machCD,machNM,data1,~~~,data430)
1) gubn -> value : 0 = Title 값 저장 ( EditDate )
2) gubn -> value : 1 = Data 값 저장 ( TMP )
3. 임시테이블에 데이터 Insert
1) gubn = 0 인 값..즉 title 값을 저장하는 데이터를
동적 쿼리를 이용해서 Insert
2) gubn = 1 인 값..즉 machCD, machNM 2개를 Grouping 한 결과값을 Insert
4. 3의 결과를 Update
--> 동적쿼리를 이용해서 (Case When 을 통해 처리..)
성능은 보장못합니다...
430으로 잡아둔건..
아무리 무식하게 조회하더라도
1년 이상 데이터를 조회하진 않을 듯 해서요^^;;
(실제 저도 최대 430일 까지만 조회되게끔 sp 프로그램(?) 짜둔 상태임)
---쿼리시작---
Declare @ll_cnt Decimal(18,0)
,@ll_i Decimal(18,0)
Drop Table #tblA
Create Table #tblA
(
EditDate Char(8) Null
,MachCD Char(5) Null
,MachNM Char(6) Null
,TMP Decimal(18,3) Null
)
Create Table #tblB
(
EditDate Char(8) Null
,rn Decimal(18,0) Null
)
Drop Table #view
Create Table #view
(
gubn Char(1) Null
,MachCD Char(5) Null
,MachNM Char(6) Null
,data1 Decimal(18,3) Null
--
,data430 Decimal(18,3) Null
)
Insert
Into #tblA
Select '20170701','11-A','200-02',0.3 Union All
Select '20170701','11-A','200-03',0.5 Union All
Select '20170702','06-A','600-26',0.7 Union All
Select '20170702','06-A','600-27',0.7 Union All
Select '20170703','01-A','600-5' ,0.7 Union All
Select '20170703','01-A','600-6' ,0.7 Union All
Select '20170703','07-A','500-1' ,0.9 Union All
Select '20170704','11-A','200-03',1.67 Union All
Select '20170705','01-A','600-5' ,0.7 Union All
Select '20170705','01-A','600-6' ,0.7 Union All
Select '20170706','01-A','600-5' ,0.7 Union All
Select '20170706','01-A','600-6' ,0.7 Union All
Select '20170707','01-A','600-5' ,0.7 Union All
Select '20170707','01-A','600-6' ,0.7
Insert
Into #tblB
Select a.EditDate
,Row_Number() Over (Partition By a.EditDate Order By a.EditDate As
From #tblA a
Group By a.EditDate
Insert
Into #view (gubn,MachCD,MachNM)
Select '1'
,a.MachCD
,a.MachNM
From #tblA a
Group By a.MachCD
,a.MachNM
-- 날짜 카운트
Select @ll_cnt = Count(1)
From #tblA a
Group By a.EditDate
IF IsNull(@ll_cnt)
Begin
Select @ll_cnt = 0
End
IF @ll_cnt > 0
Begin
Set @ls_sql = '
Update #view
Set
'
While @ll_i < @ll_cnt
Begin
Set @ll_i = @ll_i + 1
IF @ll_i = 1
Begin
Set @ls_sql = @ls_sql + 'data + Convert(Char(3),@ll_i) + ' = ( Select b.EditDate From #tblB b Where b.rn = ' + Convert(Char(3),@ll_i) + ' ) '
End
Else
Begin
Set @ls_sql = @ls_sql + ',data + Convert(Char(3),@ll_i) + ' = ( Select b.EditDate From #tblB b Where b.rn = ' + Convert(Char(3),@ll_i) + ' ) '
End
End
End
--날짜 Data Insert 는 상기 쿼리 참고하셔서 진행
--실 데이터 Update 는 직접 동적쿼리 구문 작성하시면 됨