컬럼 동적쿼리 추가 질문 드립니다. 0 8 1,350

by 고재원 [SQL Query] [2022.10.07 11:38:14]


MSSQL 2005

 

Declare @Columns Varchar(max), @SQL Varchar(max), @SQL1 Varchar(max)
Set @Columns = ''

Select @Columns = @Columns + '[' + Convert(varchar(10),Seq) + '],'
    From (
        Select Seq From SPSSCOrderNo
        ) AS ods
Set @Columns = LEFT(@Columns, LEN(@Columns) - 1)
------------


Set @SQL = ''
Set @SQL1 = ''

SET @SQL = '
SELECT CASE Detail WHEN ''OrderNo'' THEN 0 ELSE 1 END seq
     , a.*
  FROM (SELECT Seq
             , CAST(OrderNo AS VARCHAR(6)) OrderNo
             , CAST(CustNm  AS VARCHAR(6)) CustNm
             , '''' Team
             , '''' Divi
          FROM SPSSCTitle
        ) a
 UNPIVOT (v FOR Detail IN (OrderNo, CustNm)) a
 PIVOT (MIN(v) FOR Seq IN (' + @Columns + ')) a
UNION
SELECT *
  FROM (SELECT c.Seq
             , c.Team
             , c.Divi
             , c.Detail
             , c.Result
             , b.Seq AS Seq_b
          FROM SPSSCTitle b
         INNER JOIN SPSSCDetailOrder c
            ON b.OrderNo = c.OrderNo
        ) a
 PIVOT (MIN(Result) FOR Seq_b IN (' + @Columns + ')) a
'
EXEC(@SQL)

이렇게 수정했는데.. 다른 수주 건으로 내용을 등록하면 아래 표와 같이 가장 하단에 출력됩니다.

빨간색 바탕에 출력되어야 하는데. 테이블 구조는 임시 테이블 구조와 동일합니다.

15번 줄 추가했을대..

seq Team Divi Detail 1 2 3 4 5 6
0     OrderNo 18A765 20B001 20B002 20B003 20B004 20A141
1     CustNm UXN   비에이 비에이 비에이 비에이 비에이
1 광학팀 Delivery Laser NULL 1 NULL NULL 1 NULL
2 광학팀 Delivery Chiller NULL 2 NULL NULL NULL NULL
3 광학팀 Delivery BET NULL 3 NULL NULL NULL NULL
4 광학팀 Delivery BET Mount NULL 4 NULL NULL NULL NULL
5 광학팀 Delivery ATT NULL 5 NULL NULL NULL NULL
6 광학팀 Delivery Wave Plate NULL 6 NULL NULL NULL NULL
7 광학팀 Delivery POL NULL 7 NULL NULL NULL NULL
8 광학팀 Delivery Mirror 종류 NULL 8 NULL NULL NULL NULL
9 광학팀 Delivery Mirror Spring NULL 9 NULL NULL NULL NULL
10 광학팀 Head Shutter 위치 NULL 10 NULL NULL NULL NULL
11 광학팀 Head Power Meter NULL 11 NULL NULL NULL NULL
12 광학팀 Head LPC NULL 12 NULL NULL NULL NULL
13 광학팀 Head TC Lens NULL 13 NULL NULL NULL NULL
14 광학팀 Head Lens Mounting 방법 NULL 14 NULL NULL NULL NULL
15 광학팀 Delivery Laser NULL NULL NULL NULL 1 NULL

컬럼이 동적일때는 임시테이블에 담을 수 없나요?? 

by 마농 [2022.10.07 12:52:23]

15번을 추가하는데 왜 1번에 나와야 하나요?


by 고재원 [2022.10.07 13:14:25]

15줄에

15    광학팀    Delivery    Laser    20B004    1 이러게 추가했어요

그럼 이렇게 화면에 나오는데

seq Team Divi Detail 1 2 3 4 5 6 7
0     OrderNo 18A765 20B001 20B002 20B003 20B004 20A141 20A142
1     CustNm UXN   비에이 비에이 비에이 비에이 비에이 비에이
1 광학팀 Delivery Laser NULL 1 NULL NULL NULL NULL NULL
2 광학팀 Delivery Chiller NULL 2 NULL NULL NULL NULL NULL
3 광학팀 Delivery BET NULL 3 NULL NULL NULL NULL NULL
4 광학팀 Delivery BET Mount NULL 4 NULL NULL NULL NULL NULL
5 광학팀 Delivery ATT NULL 5 NULL NULL NULL NULL NULL
6 광학팀 Delivery Wave Plate NULL 6 NULL NULL NULL NULL NULL
7 광학팀 Delivery POL NULL 7 NULL NULL NULL NULL NULL
8 광학팀 Delivery Mirror 종류 NULL 8 NULL NULL NULL NULL NULL
9 광학팀 Delivery Mirror Spring NULL 9 NULL NULL NULL NULL NULL
10 광학팀 Head Shutter 위치 NULL 10 NULL NULL NULL NULL NULL
11 광학팀 Head Power Meter NULL 11 NULL NULL NULL NULL NULL
12 광학팀 Head LPC NULL 12 NULL NULL NULL NULL NULL
13 광학팀 Head TC Lens NULL 13 NULL NULL NULL NULL NULL
14 광학팀 Head Lens Mounting 방법 NULL 14 NULL NULL NULL NULL NULL
15 광학팀 Delivery Laser NULL NULL NULL NULL 1 NULL NULL

 

원하는 것은

seq Team Divi Detail 1 2 3 4 5 6 7
0     OrderNo 18A765 20B001 20B002 20B003 20B004 20A141 20A142
1     CustNm UXN   비에이 비에이 비에이 비에이 비에이 비에이
1 광학팀 Delivery Laser NULL 1 NULL NULL 1 NULL NULL
2 광학팀 Delivery Chiller NULL 2 NULL NULL NULL NULL NULL
3 광학팀 Delivery BET NULL 3 NULL NULL NULL NULL NULL
4 광학팀 Delivery BET Mount NULL 4 NULL NULL NULL NULL NULL
5 광학팀 Delivery ATT NULL 5 NULL NULL NULL NULL NULL
6 광학팀 Delivery Wave Plate NULL 6 NULL NULL NULL NULL NULL
7 광학팀 Delivery POL NULL 7 NULL NULL NULL NULL NULL
8 광학팀 Delivery Mirror 종류 NULL 8 NULL NULL NULL NULL NULL
9 광학팀 Delivery Mirror Spring NULL 9 NULL NULL NULL NULL NULL
10 광학팀 Head Shutter 위치 NULL 10 NULL NULL NULL NULL NULL
11 광학팀 Head Power Meter NULL 11 NULL NULL NULL NULL NULL
12 광학팀 Head LPC NULL 12 NULL NULL NULL NULL NULL
13 광학팀 Head TC Lens NULL 13 NULL NULL NULL NULL NULL
14 광학팀 Head Lens Mounting 방법 NULL 14 NULL NULL NULL NULL NULL

 

즉 team, divi, detail 같은 라인에 해당 번호줄에 찍히는거요?

테이블 입력받는 구조 (테이블 명 : SPSSCTitle)

Seq yyyy OrderNo CustNm
1 2018 18A765 UXN  
2 2019 20B001 비에이치  
3 2019 20B002 비에이치  
4 2019 20B003 비에이치  
5 2019 20B004 비에이치  
6 2019 20A141 비에이치  
7 2019 20A142 비에이치  

 

테이블 입력받는 구조 (테이블 명 : SPSSCDetailOrder)

Seq Team Divi Detail OrderNo Result
1 광학팀 Delivery Laser 20B001 1
2 광학팀 Delivery Chiller 20B001 2
3 광학팀 Delivery BET 20B001 3
4 광학팀 Delivery BET Mount 20B001 4
5 광학팀 Delivery ATT 20B001 5
6 광학팀 Delivery Wave Plate 20B001 6
7 광학팀 Delivery POL 20B001 7
8 광학팀 Delivery Mirror 종류 20B001 8
9 광학팀 Delivery Mirror Spring 20B001 9
10 광학팀 Head Shutter 위치 20B001 10
11 광학팀 Head Power Meter 20B001 11
12 광학팀 Head LPC 20B001 12
13 광학팀 Head TC Lens 20B001 13
14 광학팀 Head Lens Mounting 방법 20B001 14
15 광학팀 Delivery Laser 20B004 1

 

두 테이블은 데이터가 계속 추가 될 수 있어요..

테이블 설계가 잘못 되었나요?


by 마농 [2022.10.07 13:20:06]

각 OrderNo 별로 seq 가 (1~14)로 동일하게 들어가야 합니다.
seq 가 PK라면 안되구요. seq 를 대체할 다른 키항목(정렬용 항목 1~14) 컬럼이 필요합니다.


by 마농 [2022.10.07 13:23:27]

아니면 애초에 A, B, C 테이블 3개를 제시해 주셨는데.
C 테이블이 A 랑 똑같이 중복값이 들어가서 제가 쿼리에서 사용을 안했는데
C 테이블에 A 테이블의 키를 참조키로 가져가시면 됩니다.
즉 C 테이블의 구조를 다음과 같이 변경해야 합니다.
현재 : seq, Team, Divi, Detail
개선 : seq, seq_a(참조키)


by 고재원 [2022.10.11 09:30:08]

죄송하지만 다시한번 답변 부탁드립니다.

도움받아 이거 하나만 처리하면 되는데 도저희 모르겠네요.

 

-- MSSQL --

WITH tab_b AS

(

SELECT 1 Seq, '2018' yyyy, '18A765' OrderNo, 'A' CustNm

UNION ALL SELECT  2, '2019', '20B001', 'A'

UNION ALL SELECT  3, '2019', '20B002', 'A'

UNION ALL SELECT  4, '2019', '20B003', 'B'

UNION ALL SELECT  5, '2019', '20B004', 'B'

UNION ALL SELECT  6, '2019', '20A141', 'B'

UNION ALL SELECT  7, '2019', '20A142', 'B'

UNION ALL SELECT  8, '2019', '20B010', 'B'

UNION ALL SELECT  9, '2019', '20B011', 'D'

UNION ALL SELECT 10, '2021', '21A001', 'D'

UNION ALL SELECT 11, '2021', '21A002', 'D'

UNION ALL SELECT 12, '2021', '21A003', 'D'

)

, tab_c AS

(

SELECT 2 Seq, '광학팀' Team, 'Delivery' Divi, 'Laser' Detail, '20B001' OrderNo, null Result

UNION ALL SELECT  9, '광학팀', 'Delivery', 'Chiller'      , '20B001', null

UNION ALL SELECT 10, '광학팀', 'Delivery', 'BET'          , '20B001', 'O'

UNION ALL SELECT 11, '광학팀', 'Delivery', 'BET Mount'    , '20B001', 'O'

UNION ALL SELECT 12, '광학팀', 'Delivery', 'ATT'          , '20B001', 'X'

UNION ALL SELECT 13, '광학팀', 'Delivery', 'Wave Plate'   , '20B001', null

UNION ALL SELECT 14, '광학팀', 'Delivery', 'POL'          , '20B001', null

UNION ALL SELECT 15, '광학팀', 'Delivery', 'Mirror 종류'  , '20B001', null

UNION ALL SELECT 16, '광학팀', 'Delivery', 'Mirror Spring', '20B001', null

UNION ALL SELECT 17, '광학팀', 'Head'    , 'Shutter 위치' , '20B001', null

UNION ALL SELECT 18, '광학팀', 'Head'    , 'Power Meter'  , '20B001', null

UNION ALL SELECT 19, '광학팀', 'Delivery', 'BET'          , '20B004', 'O'

)

SELECT CASE Detail WHEN 'OrderNo' THEN 0 ELSE 1 END seq

     , a.*

  FROM (SELECT Seq

             , CAST(OrderNo AS VARCHAR(6)) OrderNo

             , CAST(CustNm  AS VARCHAR(6)) CustNm

             , '' Team

             , '' Divi

          FROM tab_b

        ) a

 UNPIVOT (v FOR Detail IN (OrderNo, CustNm)) a

 PIVOT (MIN(v) FOR Seq IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])) a

 UNION

SELECT *

  FROM (SELECT c.Seq

             , c.Team

             , c.Divi

             , c.Detail

             , c.Result

             , b.Seq Seq_b

          FROM tab_b b

         INNER JOIN tab_c c

            ON b.OrderNo = c.OrderNo

        ) a

 PIVOT (MIN(Result) FOR Seq_b IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])) a

;

 

seq Team Divi Detail 1 2 3 4 5 6 7 8 9 10 11 12
0     OrderNo 18A765 20B001 20B002 20B003 20B004 20A141 20A142 20B010 20B011 21A001 21A002 21A003
1     CustNm A A A B B B B B D D D D
2 광학팀 Delivery Laser NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
9 광학팀 Delivery Chiller NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
10 학팀 Delivery BET NULL O NULL NULL O NULL NULL NULL NULL NULL NULL NULL
11 광학팀 Delivery BET Mount NULL O NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
12 광학팀 Delivery ATT NULL X NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
13 광학팀 Delivery Wave Plate NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
14 광학팀 Delivery POL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
15 광학팀 Delivery Mirror 종류 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
16 광학팀 Delivery Mirror Spring NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
17 광학팀 Head Shutter 위치 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
18 광학팀 Head Power Meter NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
19 광학팀 Delivery BET NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

by 고재원 [2022.10.07 14:37:13]

A 테이블

Seq Team Divi Detail
2 광학팀 Delivery Laser
9 광학팀 Delivery Chiller
10 광학팀 Delivery BET
11 광학팀 Delivery BET Mount
12 광학팀 Delivery ATT
13 광학팀 Delivery Wave Plate
14 광학팀 Delivery POL
15 광학팀 Delivery Mirror 종류
16 광학팀 Delivery Mirror Spring
17 광학팀 Head Shutter 위치
18 광학팀 Head Power Meter
21 광학팀 Head LPC
22 광학팀 Head TC Lens
23 광학팀 Head Lens Mounting 방법

 

B 테이블

Seq yyyy OrderNo CustNm
1 2018 18A765 UXN  
2 2019 20B001 비에이치  
3 2019 20B002 비에이치  
4 2019 20B003 비에이치  
5 2019 20B004 비에이치  
6 2019 20A141 비에이치  
7 2019 20A142 비에이치  
8 2019 20B010 비에이치  
9 2019 20B011 비에이치  

 

C 테이블 (idx 컬럼 추가 - A테이블 Seq 값)

Seq idx Team Divi Detail OrderNo Result
1 2 광학팀 Delivery Laser 20B001 1
2 2 광학팀 Delivery Chiller 20B001 2
3 2 광학팀 Delivery BET 20B001 3
4 2 광학팀 Delivery BET Mount 20B001 4
5 2 광학팀 Delivery ATT 20B001 5
6 2 광학팀 Delivery Wave Plate 20B001 6
7 2 광학팀 Delivery POL 20B001 7
8 2 광학팀 Delivery Mirror 종류 20B001 8
9 2 광학팀 Delivery Mirror Spring 20B001 9
10 2 광학팀 Head Shutter 위치 20B001 10
11 2 광학팀 Head Power Meter 20B001 11
12 2 광학팀 Head LPC 20B001 12
13 2 광학팀 Head TC Lens 20B001 13
14 2 광학팀 Head Lens Mounting 방법 20B001 14
15 2 광학팀 Delivery Laser 20B004 1

 

여기서 어떤식으로 변경해야 하나요??


Declare @Columns Varchar(max), @SQL Varchar(max), @SQL1 Varchar(max)
Set @Columns = ''

Select @Columns = @Columns + '[' + Convert(varchar(10),Seq) + '],'
    From (
        Select Seq From SPSSCOrderNo
        ) AS ods
Set @Columns = LEFT(@Columns, LEN(@Columns) - 1)
------------


Set @SQL = ''
Set @SQL1 = ''

SET @SQL = '
SELECT CASE Detail WHEN ''OrderNo'' THEN 0 ELSE 1 END seq
     , a.*
  FROM (SELECT Seq
             , CAST(OrderNo AS VARCHAR(6)) OrderNo
             , CAST(CustNm  AS VARCHAR(6)) CustNm
             , '''' Team
             , '''' Divi
          FROM SPSSCTitle
        ) a
 UNPIVOT (v FOR Detail IN (OrderNo, CustNm)) a
 PIVOT (MIN(v) FOR Seq IN (' + @Columns + ')) a
UNION
SELECT *
  FROM (SELECT c.Seq
             , c.Team
             , c.Divi
             , c.Detail
             , c.Result
             , b.Seq AS Seq_b
          FROM SPSSCTitle b
         INNER JOIN SPSSCDetailOrder c
            ON b.OrderNo = c.OrderNo
        ) a
 PIVOT (MIN(Result) FOR Seq_b IN (' + @Columns + ')) a
'
EXEC(@SQL)
 


by 마농 [2022.10.11 11:01:31]
WITH tab_a AS
(
SELECT 2 Seq, '광학팀' Team, 'Delivery' Divi, 'Laser' Detail
UNION ALL SELECT  9, '광학팀', 'Delivery', 'Chiller'
UNION ALL SELECT 10, '광학팀', 'Delivery', 'BET'
UNION ALL SELECT 11, '광학팀', 'Delivery', 'BET Mount'
UNION ALL SELECT 12, '광학팀', 'Delivery', 'ATT'
UNION ALL SELECT 13, '광학팀', 'Delivery', 'Wave Plate'
UNION ALL SELECT 14, '광학팀', 'Delivery', 'POL'
UNION ALL SELECT 15, '광학팀', 'Delivery', 'Mirror 종류'
UNION ALL SELECT 16, '광학팀', 'Delivery', 'Mirror Spring'
UNION ALL SELECT 17, '광학팀', 'Head'    , 'Shutter 위치'
UNION ALL SELECT 18, '광학팀', 'Head'    , 'Power Meter'
UNION ALL SELECT 21, '광학팀', 'Head'    , 'LPC'
UNION ALL SELECT 22, '광학팀', 'Head'    , 'TC Lens'
UNION ALL SELECT 23, '광학팀', 'Head'    , 'Lens Mounting 방법'
)
, tab_b AS
(
SELECT 1 Seq, '2018' yyyy, '18A765' OrderNo, 'UXN' CustNm
UNION ALL SELECT 2, '2019', '20B001', '비에이치'
UNION ALL SELECT 3, '2019', '20B002', '비에이치'
UNION ALL SELECT 4, '2019', '20B003', '비에이치'
UNION ALL SELECT 5, '2019', '20B004', '비에이치'
UNION ALL SELECT 6, '2019', '20A141', '비에이치'
UNION ALL SELECT 7, '2019', '20A142', '비에이치'
UNION ALL SELECT 8, '2019', '20B010', '비에이치'
UNION ALL SELECT 9, '2019', '20B011', '비에이치'
)
, tab_c AS
(
SELECT 1 Seq, 2 idx, '20B001' OrderNo, '1' Result
UNION ALL SELECT  2,  9, '20B001', '2'
UNION ALL SELECT  3, 10, '20B001', '3'
UNION ALL SELECT  4, 11, '20B001', '4'
UNION ALL SELECT  5, 12, '20B001', '5'
UNION ALL SELECT  6, 13, '20B001', '6'
UNION ALL SELECT  7, 14, '20B001', '7'
UNION ALL SELECT  8, 15, '20B001', '8'
UNION ALL SELECT  9, 16, '20B001', '9'
UNION ALL SELECT 10, 17, '20B001', '10'
UNION ALL SELECT 11, 18, '20B001', '11'
UNION ALL SELECT 12, 21, '20B001', '12'
UNION ALL SELECT 13, 22, '20B001', '13'
UNION ALL SELECT 14, 23, '20B001', '14'
UNION ALL SELECT 15,  2, '20B004', '1'
)
SELECT CASE Detail WHEN 'OrderNo' THEN 0 ELSE 1 END Seq
     , a.*
  FROM (SELECT Seq
             , CAST(OrderNo AS VARCHAR(30)) OrderNo
             , CAST(CustNm  AS VARCHAR(30)) CustNm
             , '' Team
             , '' Divi
          FROM tab_b
        ) a
 UNPIVOT (v FOR Detail IN (OrderNo, CustNm)) a
 PIVOT (MIN(v) FOR Seq IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])) a
 UNION
SELECT *
  FROM (SELECT c.Idx
             , a.Team
             , a.Divi
             , a.Detail
             , c.Result
             , b.Seq
          FROM tab_c c
         INNER JOIN tab_b b
            ON c.OrderNo = b.OrderNo
         INNER JOIN tab_a a
            ON c.Idx = a.Seq
        ) a
 PIVOT (MIN(Result) FOR Seq IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])) a
;

 


by 고재원 [2022.10.11 11:53:16]

진심 감사드립니다. 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입