SELECT ITEM,
NO,
DECODE(NO,1,GRADE,'소계'),
SUM(M_QTY), SUM(M_AMT),
SUM(S_QTY), SUM(S_AMT)
FROM ( SELECT ITEM, GRADE,
M_QTY, M_AMT,
S_QTY, S_AMT
FROM TAB1
WHERE YYMM = :YMD
AND SAUP = :SAUP
GROUP BY ITEM, GRADE ) x, TEMP y
WHERE y.NO <= 2
GROUP BY ITEM,
NO,
DECODE(NO,1,GRADE,'소계')
TEMP 테이블의 NO에 인덱스가 있는 것이 좋음 (실행계획에 영향을 미침)
반드시 IINLIINE VIIEW가 먼저 수행되는 NESTED LOOP 조인이 되거나
SORT MERGE 조인이 되도록 할 것
(1)아래와 같은 생산테이블이 있다. 항목별 등급별 생산량,생산원가,판매량,매출원가의 합계를 구하고
항목이 달라질 경우 항목별 소계를 출력하라
<생산테이블>
CREATE TABLE TAB6(
ITEM VARCHAR2(10), /*항목*/
GRADE VARCHAR2(10), /*등급*/
PQTY NUMBER, /*생산량*/
PCOST NUMBER, /*생산원가*/
SQTY NUMBER, /*판매량*/
SCOST NUMBER /*판매원가*/
);
(2)테이블 생성/인서트
SQL> CREATE TABLE TAB6(
2 ITEM VARCHAR2(10), /*항목*/
3 GRADE VARCHAR2(10), /*등급*/
4 PQTY NUMBER, /*생산량*/
5 PCOST NUMBER, /*생산원가*/
6 SQTY NUMBER, /*판매량*/
7 SCOST NUMBER /*판매원가*/
8 );
테이블이 생성되었습니다.
SQL> INSERT INTO TAB6 VALUES('PA101','A1',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA101','A1',40,3000,40,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA101','A2',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA101','A2',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA101','A3',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA201','A1',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA201','A2',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA201','B1',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> INSERT INTO TAB6 VALUES('PA201','B2',100,3000,45,3500);
1 개의 행이 만들어졌습니다.
SQL> COMMIT;
커밋이 완료되었습니다.
(3)결과
SQL> SELECT ITEM
2 ,DECODE(B.NO,1,'소계',GRADE)
3 ,SUM(PQTY)
4 ,SUM(PCOST)
5 ,SUM(SQTY)
6 ,SUM(SCOST)
7 FROM TAB6 A,COPY_T B
8 WHERE B.NO<=2
9 GROUP BY ITEM,DECODE(B.NO,1,'소계',GRADE);
ITEM DECODE(B.N SUM(PQTY) SUM(PCOST) SUM(SQTY) SUM(SCOST)
===== ========== ========= ========== ======== =========
PA101 A1 140 6000 85 7000
PA101 A2 200 6000 90 7000
PA101 A3 100 3000 45 3500
PA101 소계 440 15000 220 17500
PA201 A1 100 3000 45 3500
PA201 A2 100 3000 45 3500
PA201 B1 100 3000 45 3500
PA201 B2 100 3000 45 3500
PA201 소계 400 12000 180 14000
9 개의 행이 선택되었습니다.
\*위 쿼리를 실행하면 소계가 항목 맨 밑에 나온다. 소계가 첫줄에 출력되도록 수정하라