쿼리질문드립니다. 0 8 1,473

by 오라클네티 [SQL Query] [2017.02.02 17:16:10]


테이블의 조회 결과가 10건 이하 로 조회되면 

row 행이 10건이 될수있게 빈행들을 채워주고싶습니다.

 

[예]

A 테이블에 column 이 3건 조회되었습니다.

A

B

C

 

A

B

C

Null

Null

Null

Null

Null

Null

Null

 

이렇게 조회결과를 보고 싶은데 어떻게 쿼리를 작성해야할까요?

 

만약 조회 결과가 13건 이라면 나머지 7행에 대하여 Null 행을 생성해줘야 합니다.

by 마농 [2017.02.02 17:25:52]

1. 10건 이상 조회되었을 때는요?
  - 모두 조회 vs 10건만 조회
2. 혹시, 조회시 정렬 기준이 따로 있나요?
  - 있다 vs 없다


by 오라클네티 [2017.02.02 17:36:18]

1. 모두 조회입니다. 

예를들어 A컬럼에 A, B , C 라는 데이터가 존재하고

A 데이터는 24건 B 데이터는12건 C 데이터는 6건 이 조회 되었을시에

A 데이터는 6건 null B 데이터는 8건 null C데이터는 4건 null 이 추가 행생성이 되어야합니다.

 

2. 정렬기준은 없습니다.


by jkson [2017.02.02 17:59:04]

본문이랑 댓글이랑 내용이 일치하지 않는 것 같은데..

본문은 전체 데이터 기준 10건인데

댓글은 코드별로 10건이네요. 본문을 댓글 기준대로 하면 총 30 row를 출력해야 해서 27개의 null인 row를 생성해야할 것 같은데 어느게 맞는 건가요?


by 마농 [2017.02.02 18:02:54]
WITH t AS
(
SELECT 1 a, 'A' b FROM dual
UNION ALL SELECT 1, 'B' FROM dual
UNION ALL SELECT 1, 'C' FROM dual
UNION ALL SELECT 2, 'A' FROM dual
UNION ALL SELECT 2, 'B' FROM dual
UNION ALL SELECT 2, 'C' FROM dual
UNION ALL SELECT 2, 'D' FROM dual
UNION ALL SELECT 2, 'E' FROM dual
UNION ALL SELECT 2, 'F' FROM dual
UNION ALL SELECT 2, 'G' FROM dual
UNION ALL SELECT 2, 'H' FROM dual
UNION ALL SELECT 2, 'I' FROM dual
UNION ALL SELECT 2, 'J' FROM dual
UNION ALL SELECT 2, 'K' FROM dual
)
-- 1. 10 건 집합을 생성하여 파티션 아우터 조인
SELECT b.a, b.b
  FROM (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 10) a
  LEFT OUTER JOIN
       (SELECT ROWNUM rn, a, b FROM t WHERE a = :v_a) b
  PARTITION BY (CEIL(rn/10))
    ON lv = MOD(rn-1, 10)+1
 ORDER BY rn
;
-- 2. Model 절 활용 --
SELECT a, b
  FROM (SELECT ROWNUM rn, a, b FROM t WHERE a = :v_a)
 MODEL
 PARTITION BY (CEIL(rn/10) x)
 DIMENSION BY (MOD(rn-1, 10)+1 y)
 MEASURES (a, b)
 RULES (b[FOR y FROM 1 TO 10 INCREMENT 1] = b[CV()])
 ORDER BY x, y
;
-- 3. 부족한 만큼만 Union 붙이기
SELECT a, b
  FROM t
 WHERE a = :v_a
 UNION ALL
SELECT null, null
  FROM (SELECT 10 - (MOD(COUNT(*)-1, 10)+1) cnt FROM t WHERE a = :v_a)
 CONNECT BY LEVEL <= cnt
;

 


by jkson [2017.02.02 18:13:17]

저의 미천한 이해력이 또 혼돈을 일으켰는데 마농님이 이해하신 게 아마도 맞겠죠?

전체 데이터 row 기준으로 10개 단위로 null값 생성..

WITH T AS
(
SELECT 'A' COL FROM DUAL UNION ALL
SELECT 'B' COL FROM DUAL UNION ALL
--SELECT 'D' COL FROM DUAL UNION ALL
--SELECT 'E' COL FROM DUAL UNION ALL
--SELECT 'F' COL FROM DUAL UNION ALL
--SELECT 'G' COL FROM DUAL UNION ALL
--SELECT 'H' COL FROM DUAL UNION ALL
--SELECT 'I' COL FROM DUAL UNION ALL
--SELECT 'J' COL FROM DUAL UNION ALL
--SELECT 'K' COL FROM DUAL UNION ALL
--SELECT 'L' COL FROM DUAL UNION ALL
--SELECT 'M' COL FROM DUAL UNION ALL
--SELECT 'N' COL FROM DUAL UNION ALL
SELECT 'C' COL FROM DUAL
)
SELECT COL
  FROM (SELECT COL, COUNT(COL) OVER () TOTCNT
          FROM (SELECT COL FROM T
                UNION ALL
                SELECT NULL FROM DUAL CONNECT BY LEVEL <= 10
               )
       )
 WHERE ROWNUM <= DECODE(MOD(TOTCNT,10), 0, TOTCNT, TOTCNT + 10 - MOD(TOTCNT,10) )

 


by 잡초 [2017.02.02 18:39:45]
WITH TT AS 
(
SELECT EMPNO
FROM EMP
)

SELECT EMPNO FROM TT

UNION ALL
         
SELECT NULL
FROM DUAL
CONNECT BY LEVEL <= 10-(SELECT Mod(Count(*)-1,10)+1 FROM TT)
 

 


by 마농 [2017.02.02 21:31:30]

건수가 딱 10 의 배수인 경우 널이 10 개 생겨버리는 오류가...
 - 수정전 : Mod(Count(*),10)
 - 수정후 : Mod(Count(*)-1,10)+1


by 잡초 [2017.02.03 08:49:22]

아하 그러네요

감사합니다!

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