소계, 합계 쿼리 질문 드립니다. 0 2 1,475

by guramoto [SQL Query] [2014.02.07 09:55:54]


t1의 내용

CODE VAL1 GROUPYN A 10 N B 20 N C 30 N D 40 N G1,G2,G3 (null) Y G1 50 N G2 60 N G3 70 N
=================================

원하는 결과

CODE		VAL1					GROUPYN
		280 (합계 : 10+20+30+40+50+60+70의 결과 입니다.)	
A		10					N
B		20					N
C		30					N
D		40					N
G1,G2,G3	180 (그룹소계 : 50+60+70의 결과 입니다.)Y
G1		50					N
G2		60					N
G3		70					N
=================================

WITH t AS
(
SELECT 'A' AS CODE, 10 AS VAL1, 'N' AS GROUPYN FROM dual
UNION ALL SELECT 'B', 20, 'N' FROM dual
UNION ALL SELECT 'C', 30, 'N' FROM dual
UNION ALL SELECT 'D', 40, 'N' FROM dual
UNION ALL SELECT 'G1,G2,G3', NULL, 'Y' FROM dual
UNION ALL SELECT 'G1', 50, 'N' FROM dual
UNION ALL SELECT 'G2', 60, 'N' FROM dual
UNION ALL SELECT 'G3', 70, 'N' FROM dual
)
SELECT *
FROM t


t1의 CODE는 pk이며
GROUPYN의 값이 'Y'일 경우 2개 이상의 코드로 이루어진 그룹이며
그룹의 CODE는 그룹원들의 CODE 값들로 이루어집니다.

위에서 원하는 결과의
[합계 : 10+20+30+40+50+60+70] 부분의 원하는 값은 280
[그룹소계 : 50+60+70] 부분의 원하는 값은 180
의 소계 합계를 구하는 쿼리 좀 부탁드립니다.
by 마농 [2014.02.07 11:29:17]
SELECT code
     , DECODE(groupyn, 'Y'
       , (SELECT SUM(val1) FROM t b WHERE INSTR(','||a.code||',', ','||b.code||',') > 0)
       , SUM(val1)
       ) val1
     , groupyn
  FROM t a
 GROUP BY ROLLUP((code, groupyn))
 ORDER BY DECODE(groupyn, 'Y', SUBSTR(code, 1, 1), code) NULLS FIRST
;
-- 합계는 구할 수 있지만.. 정렬은 어찌해야 할지 모르겠네요.
-- 위 데티어에 맞는 결과는 일단 나오게 했지만 데이터가 달라진다면...

by guramoto [2014.02.07 12:39:03]
답변 정말 감사합니다.
정렬은 ordering 컬럼이 따로 있어서 크게 문제될 건 없고요.
데이터가 달라질 경우 테스트 해봐야겠네요.
항상 많이 배우고 갑니다. 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입