SQL*Plus, 데이터 연결 방법 – Union, Group by

SQL*Plus, 데이터 연결 방법 – Union, Group by

항목 합계 1월 2월 3월 생략
(1)총매출액 725,910 생략 생략 생략 생략
(2)매출원가(-) 585,550 생략 생략 생략 생략
(3)매출총이익 140,360 생략 생략 생략 생략
(4)판매비 14,450 생략 생략 생략 생략
(5)일반관리비 10,980 생략 생략 생략 생략
(6)직접 R&D 6,147 생략 생략 생략 생략
(7)이자비용 1,692 생략 생략 생략 생략
(8)영업외수익(-) 3,420 생략 생략 생략 생략
(9)영업외비용 5,695 생략 생략 생략 생략
(10)본부비등 656 생략 생략 생략 생략
(11)직업비 계 36,200 생략 생략 생략 생략
(12)공헌이익 104,160 생략 생략 생략 생략
(13)간접비 24,120 생략 생략 생략 생략
(14)경상이익 80,040 생략 생략 생략 생략

* 단, (숫자)는 LINE 넘버

SELECT 
	sum(tot*decode(NO-LINE,1,-1,3,-1,1) ) tot
	, sum(W01*decode(NO-LINE,1,-1,3,-1,1))
	, …
FROM  
( 
	SELECT 
		LINE
		, sum(AMT)  TOT
		, sum(decode(MM,'01',AMT)) W01
		, …
	FROM
	(
		SELECT 
			y.NO LINE
			, MM
			, sum(AMT*decode(y.NO*LINE,6,-1,1) ) AMT /* LINE * y.NO 를 곱해서 6이 나오면 매출원가, -1을 곱해서 총매출액 - 매출원가 = 매출총이익을 산출 */
		FROM  
		(
			SELECT
				'1'  LINE
				, substr(년월,5,2) MM
				, sum(AMT) AMT	/* 총매출액 */
			FROM 매출집계
			WHERE 년월 LIKE '1997%'
			GROUP BY substr(년월,5,2)
			UNION ALL
			SELECT  
				'2'  LINE
				, substr(년월,5,2) MM
				, sum(AMT) AMT	/* 매출원가 */
			FROM 매출원가
			WHERE 년월 LIKE '1997%'
			GROUP BY substr(년월,5,2) 
		) x, COPY_T y
		WHERE y.NO IN (LINE, 3)
		GROUP BY y.NO, MM
		UNION ALL
		SELECT 
			y.NO LINE
			, MM
			, SUM(AMT*decode(y.NO*LINE,88,-1,1) ) AMT	/* 8에 LINE 11 = 88 */
		FROM  
		(
			SELECT 
				decode(substr(계정,1,2),'21', 13, substr(계정,2,2)+1) LINE
				, substr(일자,5,2) MM
				, SUM(AMT) AMT
			FROM 전표집계
			WHERE 일자 LIKE '1997%'
			AND 계정 BETWEEN '203' AND '219'	/* 210부터 219까지는 간접비 */
			GROUP BY decode(substr(계정,1,2),'21', 13, substr(계정,2,2)+1), substr(일자,5,2) /* LINE 13은 간접비 */	 
		) x, COPY_T y
		WHERE y.NO IN (LINE,decode(LINE,13,NULL,11))
		GROUP BY y.NO, MM 
	)
	GROUP BY LINE 
) x,  COPY_T  y
WHERE y.NO IN(LINE, decode(LINE,3,12, 11,12), decode(LINE,3,14,11,14,13,14)) 
GROUP BY y.NO;

원문 출처
Encore – 대용량 데이터베이스

Leave a Reply