order by 문의 0 7 1,428

by 크오옹 [SQL Query] order by [2020.04.17 13:00:17]


WITH TST AS
(
 SELECT 1 SEQ, '1111' ID, 'B' GB FROM DUAL UNION
 SELECT 2, '2222', 'A' FROM DUAL UNION
 SELECT 3, '3333', '' FROM DUAL UNION
 SELECT 4, '4444', 'B' FROM DUAL UNION
 SELECT 5, '5555', '' FROM DUAL
)
SELECT TST.*
  FROM TST

결과값
SEQ  ID  GB
1	1111	B
4	4444	B
2	2222	A
3	3333	
5	5555	

 

위와 같은 형태로 출력하고 싶습니다.
SEQ가 작은 값이 먼저 노출되고 GB가 같은 건은 바로 아래 row에 노출되게 하고 싶은데
ORDER BY를 어떻게 줘야 하는지 고민되어 문의 드립니다. 고수님들의 조언 부탁 드립니다.

by 삐르짱 [2020.04.17 13:22:30]
WITH TST AS
(
 SELECT 1 SEQ, '1111' ID, 'B' GB FROM DUAL UNION
 SELECT 2, '2222', 'A' FROM DUAL UNION
 SELECT 3, '3333', '' FROM DUAL UNION
 SELECT 4, '4444', 'B' FROM DUAL UNION
 SELECT 5, '5555', '' FROM DUAL
)
SELECT TST.*
  FROM TST
 ORDER BY GB DESC NULLS LAST
        , SEQ ASC

 


by 크오옹 [2020.04.17 13:34:11]
WITH TST AS

(

 SELECT 1 SEQ, '1111' ID, 'B' GB FROM DUAL UNION

 SELECT 2, '2222', '' FROM DUAL UNION

 SELECT 3, '3333', 'A' FROM DUAL UNION

 SELECT 4, '4444', 'B' FROM DUAL UNION

 SELECT 5, '5555', '' FROM DUAL

)

SELECT TST.*

  FROM TST

 ORDER BY GB DESC NULLS LAST

        , SEQ ASC

예를 들어 2, 3번의 GB값을 바꾸면 해당 ORDER BY로는 적용되지 않습니다.

SEQ가 우선이고 같은 GB에 있는 ID가 밑에 노출되도록 하고자 합니다.


by 느훼훼 [2020.04.17 13:35:30]

ORDER BY NVL(GB, '1') DESC, SEQ -- GB값이 알파벳이라는 가정하에....


by 샤랄라 [2020.04.17 14:00:16]
WITH TST AS
(
SELECT 1 SEQ, '1111' ID, 'B' GB FROM DUAL UNION
SELECT 2, '2222', 'A' FROM DUAL UNION
SELECT 3, '3333', '' FROM DUAL UNION
SELECT 4, '4444', 'B' FROM DUAL UNION
SELECT 5, '5555', '' FROM DUAL
)
SELECT *
FROM TST
order by min(seq) over(partition by gb), seq
;

-- order by 부분 정정합니다.
order by decode(gb, null, seq, min(seq) over(partition by gb)), seq

 


by 랑에1 [2020.04.17 14:10:52]
WITH TST AS
(
 SELECT 1 SEQ, '1111' ID, 'B' GB FROM DUAL UNION
 SELECT 2, '2222', 'A' FROM DUAL UNION
 SELECT 3, '3333', '' FROM DUAL UNION
 SELECT 4, '4444', 'B' FROM DUAL UNION
 SELECT 5, '5555', '' FROM DUAL
)

SELECT seq, id, gb
FROM 
(
SELECT TST.*     
     , CASE WHEN COUNT(gb) OVER(PARTITION BY gb) > 1 THEN MIN(SEQ) OVER(PARTITION BY gb)
            ELSE 999 END gb2
  FROM TST
) 
ORDER BY gb2, seq

 


by 마농 [2020.04.17 14:22:02]

샤랄라 님 방법이 맞긴 한데.. NULL 구분이 좀 애매할 것 같네요.
널도 하나의 그룹으로 묶여야 할지?
널은 그룹이 없다고 보고 행별로 처리해야 할지?
이 부분을 질문자 분께서 명확하게 정해주셔야 할 것 같습니다.
1111 의 gb 가 '' 일 경우 3333, 5555 가 1111 과 한묶음으로 처리되어야 하는지?


아하!
의문을 제기하기 전에 샤랄라 님이 답변을 수정하셨네요.
2가지 경우에 대한 답변이 다 있네요.


by 유령회원 [2020.04.18 14:16:53]

샤랄라님 쿼리를 이렇게 수정해도 같은 결과값입니다.

order by min(seq) over(partition by nvl(gb,seq)), seq

 

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