MSSQL 쿼리 질문드립니다..! 0 5 2,042

by 도리도리 [SQL Query] [2023.04.18 16:27:38]


 

테이블명 DAILY_WORK 

테이블 값

JISI_NO JISI_SERIAL SORT P_NAME
JISI2304182 1 1 제품명1
JISI2304182 2 1 제품명2
JISI2304182 3 1 제품명3
JISI2304182 4 1 제품명4
JISI2304182 5 1 제품명5
JISI2304182 6 1 제품명6
JISI2304182 7 1 제품명7
JISI2304182 8 1 제품명8
JISI2304183 1 1 제품명1
JISI2304183 2 1 제품명2
JISI2304183 3 1 제품명3
JISI2304183 4 2 제품명4
JISI2304183 5 2 제품명5
JISI2304183 6 2 제품명6
JISI2304183 7 2 제품명7
JISI2304183 8 2 제품명8
JISI2304183 9 2 제품명9
JISI2304183 10 2 제품명10
JISI2304183 11 2 제품명11
JISI2304183 12 2 제품명12
JISI2304183 13 2 제품명13
JISI2304183 14 2 제품명14
JISI2304183 15 2 제품명15

 

결과값

JISI_NO SORT P_NAME1 P_NAME2 P_NAME3 P_NAME4 P_NAME5
JISI2304182 1 제품명1 제품명2 제품명3 제품명4 제품명5
JISI2304182 1 제품명6 제품명7 제품명8    
JISI2304183 1 제품명1 제품명2 제품명3    
JISI2304183 2 제품명4 제품명5 제품명6 제품명7 제품명8
JISI2304183 2 제품명9 제품명10 제품명11 제품명12 제품명13
JISI2304183 2 제품명14 제품명15      

 

결과 값처럼 구현하고 싶은데 어떻게 해야할지 조언 부탁드립니다.

by 마농 [2023.04.18 17:20:58]
WITH daily_work AS
(
SELECT 'JISI2304182' jisi_no, 1 jisi_serial, 1 sort, '제품명1' p_name
UNION ALL SELECT 'JISI2304182',  2, 1, '제품명2' 
UNION ALL SELECT 'JISI2304182',  3, 1, '제품명3' 
UNION ALL SELECT 'JISI2304182',  4, 1, '제품명4' 
UNION ALL SELECT 'JISI2304182',  5, 1, '제품명5' 
UNION ALL SELECT 'JISI2304182',  6, 1, '제품명6' 
UNION ALL SELECT 'JISI2304182',  7, 1, '제품명7' 
UNION ALL SELECT 'JISI2304182',  8, 1, '제품명8' 
UNION ALL SELECT 'JISI2304183',  1, 1, '제품명1' 
UNION ALL SELECT 'JISI2304183',  2, 1, '제품명2' 
UNION ALL SELECT 'JISI2304183',  3, 1, '제품명3' 
UNION ALL SELECT 'JISI2304183',  4, 2, '제품명4' 
UNION ALL SELECT 'JISI2304183',  5, 2, '제품명5' 
UNION ALL SELECT 'JISI2304183',  6, 2, '제품명6' 
UNION ALL SELECT 'JISI2304183',  7, 2, '제품명7' 
UNION ALL SELECT 'JISI2304183',  8, 2, '제품명8' 
UNION ALL SELECT 'JISI2304183',  9, 2, '제품명9' 
UNION ALL SELECT 'JISI2304183', 10, 2, '제품명10'
UNION ALL SELECT 'JISI2304183', 11, 2, '제품명11'
UNION ALL SELECT 'JISI2304183', 12, 2, '제품명12'
UNION ALL SELECT 'JISI2304183', 13, 2, '제품명13'
UNION ALL SELECT 'JISI2304183', 14, 2, '제품명14'
UNION ALL SELECT 'JISI2304183', 15, 2, '제품명15'
)
SELECT *
  FROM (SELECT jisi_no, sort
             , CEILING(rn / 5.) sort_
             , CONCAT('P_NAME', (rn - 1) % 5 + 1) gb
             , p_name
          FROM (SELECT jisi_no, sort, jisi_serial, p_name
                     , ROW_NUMBER() OVER(PARTITION BY jisi_no, sort ORDER BY jisi_serial) rn
                  FROM daily_work
                ) a
        ) a
 PIVOT (MIN(p_name) FOR gb IN ([P_NAME1], [P_NAME2], [P_NAME3], [P_NAME4], [P_NAME5])) a
 ORDER BY jisi_no, sort, sort_
;

 


by 도리도리 [2023.04.19 08:28:10]

감사합니다 마농님  좋은하루 되세요:)


by 도리도리 [2023.04.19 17:31:49]

안녕하세요 답변주신 방법으로 코드를 작성을 했습니다!

저는 INNER JOIN을 사용해서 원하는 결과 값을 얻었는데 INNER JOIN 아닌 다른 간결한 문장을 사용할 수 있을까요?

결과 값

JISI_NO SORT SORT_ MTB_NAME1 JISI_SERIAL1 MTB_NAME2 JISI_SERIAL2 MTB_NAME3 JISI_SERIAL3 MTB_NAME4 JISI_SERIAL4 MTB_NAME5 JISI_SERIAL5
JISI2304183 1 1 제품명1 1 제품명2 2 제품명3 3 NULL NULL NULL NULL
JISI2304183 2 1 제품명4 4 제품명5 5 제품명6 6 제품명7 7 제품명8 8
JISI2304183 2 2 제품명9 9 제품명10 10 제품명11 11 제품명12 12 제품명13 13
JISI2304183 2 3 제품명14 14 제품명15 15 NULL NULL NULL NULL NULL NULL

 

입력한 코드

SELECT PVT_MTB.JISI_NO, PVT_MTB.SORT, PVT_MTB.SORT_, MTB_NAME1, JISI_SERIAL1, MTB_NAME2, JISI_SERIAL2, MTB_NAME3, JISI_SERIAL3, MTB_NAME4, JISI_SERIAL4, MTB_NAME5, JISI_SERIAL5
FROM 
(
    SELECT JISI_NO, SORT, CEILING(RN / 5.) SORT_, CONCAT('MTB_NAME', (RN - 1) % 5 + 1) AS GB,
    RIGHT(MTB_NAME,CHARINDEX('|', REVERSE(MTB_NAME))-1) AS MTB_NAME 
    FROM 
    (
        SELECT JISI_NO, SORT, CONVERT(VARCHAR(10), JISI_SERIAL) + '|' + 
        (SELECT MTB_NAME FROM ORDER_BODY WHERE ORDER_NO = X.ORDER_NO AND ORDER_SERIAL = X.ORDER_SERIAL) AS MTB_NAME,
        ROW_NUMBER() OVER(PARTITION BY JISI_NO, SORT ORDER BY JISI_SERIAL) RN
        FROM ORDER_DAILY_WORK X
    ) A
) A
PIVOT (
    MIN(MTB_NAME) FOR GB IN ([MTB_NAME1], [MTB_NAME2], [MTB_NAME3], [MTB_NAME4], [MTB_NAME5])
) AS PVT_MTB
INNER JOIN 
(
    SELECT JISI_NO, SORT, CEILING(RN / 5.) SORT_, CONCAT('JISI_SERIAL', (RN - 1) % 5 + 1) AS JS,
    LEFT(MTB_NAME, CHARINDEX('|', MTB_NAME)-1) AS JISI_SERIAL 
    FROM 
    (
        SELECT JISI_NO, SORT, CONVERT(VARCHAR(10), JISI_SERIAL) + '|' + 
        (SELECT MTB_NAME FROM ORDER_BODY WHERE ORDER_NO = X.ORDER_NO AND ORDER_SERIAL = X.ORDER_SERIAL) AS MTB_NAME,
        ROW_NUMBER() OVER(PARTITION BY JISI_NO, SORT ORDER BY JISI_SERIAL) RN
        FROM ORDER_DAILY_WORK X
    ) A
) A
PIVOT (
    MIN(JISI_SERIAL) FOR JS IN ([JISI_SERIAL1], [JISI_SERIAL2], [JISI_SERIAL3], [JISI_SERIAL4], [JISI_SERIAL5])
) AS PVT_JS
ON PVT_MTB.JISI_NO = PVT_JS.JISI_NO AND PVT_MTB.SORT = PVT_JS.SORT AND PVT_MTB.SORT_ = PVT_JS.SORT_
ORDER BY PVT_MTB.JISI_NO, PVT_MTB.SORT, PVT_MTB.SORT_
 


by 마농 [2023.04.19 18:01:26]
SELECT jisi_no
     , sort
     , sort_
     , MIN(CASE gb WHEN 1 THEN mtb_name    END)    mtb_name1
     , MIN(CASE gb WHEN 1 THEN jisi_serial END) jisi_serial1
     , MIN(CASE gb WHEN 2 THEN mtb_name    END)    mtb_name2
     , MIN(CASE gb WHEN 2 THEN jisi_serial END) jisi_serial2
     , MIN(CASE gb WHEN 3 THEN mtb_name    END)    mtb_name3
     , MIN(CASE gb WHEN 3 THEN jisi_serial END) jisi_serial3
     , MIN(CASE gb WHEN 4 THEN mtb_name    END)    mtb_name4
     , MIN(CASE gb WHEN 4 THEN jisi_serial END) jisi_serial4
     , MIN(CASE gb WHEN 5 THEN mtb_name    END)    mtb_name5
     , MIN(CASE gb WHEN 5 THEN jisi_serial END) jisi_serial5
  FROM (SELECT jisi_no
             , sort
             , jisi_serial
             , mtb_name
             , CEILING(rn / 5.) sort_
             , (RN - 1) % 5 + 1 gb
          FROM (SELECT a.jisi_no
                     , a.sort
                     , a.jisi_serial
                     , b.mtb_name
                     , ROW_NUMBER() OVER(PARTITION BY a.jisi_no, a.sort ORDER BY a.jisi_serial) rn
                  FROM order_daily_work a
                 INNER JOIN order_body b
                    ON a.order_no     = b.order_no
                   AND a.order_serial = b.order_serial
                ) a
        ) a
 GROUP BY jisi_no, sort, sort_
 ORDER BY jisi_no, sort, sort_
;

 


by 도리도리 [2023.04.19 19:11:54]

좋은 답변 주셔서 감사합니다!

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