SQL 쿼리 질문입니다. 도움 부탁 드립니다. 0 2 807

by 뉴스쿨84 [SQL Query] [2017.10.31 17:54:55]


쿼리 결과를 Summary 하여 9999 값을 제외 후 정렬하려고 하는데 방법이 있을가요?

2번 결과와 같이 쿼리를 했으면 하는데 방법이 있는지 조언 부탁 드립니다.ㅠㅠ

 

1번

SU MB BG IC GG
3007 9999 9999 9999 9999
3008 9999 9999 9999 9999
3009 9999 9999 9999 9999
3010 9999 9999 9999 9999
3011 9999 9999 9999 9999
9999 4001 9999 9999 9999
9999 4002 9999 9999 9999
9999 4003 9999 9999 9999
9999 4004 9999 9999 9999
9999 4005 9999 9999 9999
3012 9999 9999 9999 9999
3013 9999 9999 9999 9999
9999 4006 9999 9999 9999
9999 4007 9999 9999 9999
9999 9999 5001 9999 9999
9999 9999 5002 9999 9999
9999 9999 5003 9999 9999
9999 9999 5004 9999 9999
9999 9999 5005 9999 9999
9999 9999 5006 9999 9999
9999 9999 5007 9999 9999
9999 9999 5008 9999 9999
9999 9999 9999 1001 9999
9999 9999 9999 1002 9999
9999 9999 9999 1003 9999
9999 9999 9999 1004 9999
9999 9999 9999 1005 9999
9999 9999 9999 1006 9999
9999 4008 9999 9999 9999
9999 4009 9999 9999 9999
9999 4010 9999 9999 9999
9999 4011 9999 9999 9999
9999 9999 5009 9999 9999
9999 9999 5010 9999 9999
9999 9999 9999 9999 2001
9999 9999 9999 9999 2002
9999 9999 9999 9999 2003
9999 9999 9999 9999 2004
9999 9999 9999 9999 2005
9999 9999 9999 9999 2006
9999 9999 9999 9999 2007
9999 9999 9999 9999 2008

 

 

2번 결과 

SU MB BG IC GG
3007 4001 5001 1001 2001
3008 4002 5002 1002 2002
3009 4003 5003 1003 2003
3010 4004 5004 1004 2004
3011 4005 5005 1005 2005
3012 4006 5006 1006 2006
3013 4007 5007 null 2007
null 4008 5008 null 2008
null 4009 5009 null null
null 4010 5010 null null
null 4011 null null null
by 우리집아찌 [2017.10.31 19:50:37]
-- 그냥 좀 무식하게..
WITH T ( SU , MB , BG , IC )AS (
SELECT '3007' ,    '9999',    '5001'    , '1001'     FROM DUAL UNION ALL
SELECT '3008' ,    '4001',    '9999'    , '1002'     FROM DUAL UNION ALL
SELECT '3009' ,    '9999',    '9999'    , '9999'     FROM DUAL UNION ALL
SELECT '9999' ,    '9999',    '9999'    , '9999'     FROM DUAL UNION ALL
SELECT '9999' ,    '4002',    '5002'    , '9999'     FROM DUAL 
), T2 AS (
SELECT GREATEST( COUNT(CASE WHEN SU != '9999' THEN 1 END )
               , COUNT(CASE WHEN MB != '9999' THEN 1 END )
               , COUNT(CASE WHEN BG != '9999' THEN 1 END )
               , COUNT(CASE WHEN IC != '9999' THEN 1 END )
               )CNT
FROM T 
)

SELECT A.VAL , B.VAL , C.VAL , D.VAL
  FROM ( SELECT ROWNUM RN FROM DUAL CONNECT BY LEVEL <= (SELECT CNT FROM T2)  ) COPY_T
      ,( SELECT ROW_NUMBER() OVER(ORDER BY SU) RN , SU VAL FROM T WHERE SU != '9999' ) A
      ,( SELECT ROW_NUMBER() OVER(ORDER BY MB) RN , MB VAL FROM T WHERE MB != '9999' ) B
      ,( SELECT ROW_NUMBER() OVER(ORDER BY BG) RN , BG VAL FROM T WHERE BG != '9999' ) C
      ,( SELECT ROW_NUMBER() OVER(ORDER BY IC) RN , IC VAL FROM T WHERE IC != '9999' ) D
 WHERE COPY_T.RN = A.RN(+)
   AND COPY_T.RN = B.RN(+)
   AND COPY_T.RN = C.RN(+)
   AND COPY_T.RN = D.RN(+)
 ORDER BY COPY_T.RN  
    

 


by 마농 [2017.11.01 08:36:44]
SELECT *
  FROM (SELECT gb, v
             , ROW_NUMBER() OVER(PARTITION BY gb ORDER BY v) rn
          FROM t
         UNPIVOT (v FOR gb IN (su, mb, bg, ic, gg))
         WHERE v != 9999
        )
 PIVOT (MIN(v) FOR gb IN ('SU' su, 'MB' mb, 'BG' bg, 'IC' ic, 'GG' gg))
 ORDER BY rn
;

 

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