06SQL 실전: 서점 판매 데이터로 집계 확인하기
보충 실습예시 데이터를 직접 만들고, 지점별 집계와 WHERE·HAVING 비교 4가지를 실행해 결과를 확인합니다.
CREATE TABLE BOOK_SALE (
SALE_ID NUMBER(4) PRIMARY KEY,
BRANCH_ID VARCHAR2(2 CHAR) NOT NULL,
CHANNEL VARCHAR2(10 CHAR) NOT NULL,
AMOUNT NUMBER(9),
SALE_STATUS VARCHAR2(10 CHAR) NOT NULL,
CONSTRAINT CK_BS_AMOUNT CHECK (AMOUNT >= 0),
CONSTRAINT CK_BS_STATUS CHECK (SALE_STATUS IN ('PAID','PENDING'))
);
INSERT INTO BOOK_SALE VALUES (1001, 'B1', 'ONLINE', 12000, 'PAID');
INSERT INTO BOOK_SALE VALUES (1002, 'B1', 'STORE', 18000, 'PAID');
INSERT INTO BOOK_SALE VALUES (1003, 'B1', 'ONLINE', NULL, 'PENDING');
INSERT INTO BOOK_SALE VALUES (1004, 'B2', 'ONLINE', 20000, 'PAID');
INSERT INTO BOOK_SALE VALUES (1005, 'B2', 'STORE', 30000, 'PAID');
INSERT INTO BOOK_SALE VALUES (1006, 'B2', 'ONLINE', 10000, 'PAID');
INSERT INTO BOOK_SALE VALUES (1007, 'B3', 'STORE', 15000, 'PAID');
INSERT INTO BOOK_SALE VALUES (1008, 'B3', 'ONLINE', NULL, 'PENDING');
INSERT INTO BOOK_SALE VALUES (1009, 'B3', 'ONLINE', 25000, 'PAID');
COMMIT;
SELECT BRANCH_ID,
COUNT(*) AS RECORD_CNT,
COUNT(AMOUNT) AS AMOUNT_CNT,
SUM(AMOUNT) AS TOTAL_AMT,
AVG(AMOUNT) AS AVG_AMT
FROM BOOK_SALE
GROUP BY BRANCH_ID
ORDER BY BRANCH_ID;
SELECT COUNT(*) AS ALL_CNT,
COUNT(AMOUNT) AS VALUE_CNT,
COUNT(DISTINCT AMOUNT) AS DISTINCT_CNT,
SUM(AMOUNT) AS TOTAL_AMT,
AVG(AMOUNT) AS AVG_AMT,
MAX(AMOUNT) AS MAX_AMT,
MIN(AMOUNT) AS MIN_AMT
FROM BOOK_SALE
WHERE BRANCH_ID = 'B1';
SELECT AVG(NVL(AMOUNT, 0)) AS AVG_WITH_ZERO
FROM BOOK_SALE
WHERE BRANCH_ID = 'B1';
SELECT BRANCH_ID, COUNT(*) AS RECORD_CNT, SUM(AMOUNT) AS TOTAL_AMT
FROM BOOK_SALE
GROUP BY BRANCH_ID
ORDER BY BRANCH_ID;
SELECT BRANCH_ID, COUNT(*) AS RECORD_CNT, SUM(AMOUNT) AS TOTAL_AMT
FROM BOOK_SALE
WHERE AMOUNT >= 20000
GROUP BY BRANCH_ID
ORDER BY BRANCH_ID;
SELECT BRANCH_ID, COUNT(*) AS RECORD_CNT, SUM(AMOUNT) AS TOTAL_AMT
FROM BOOK_SALE
GROUP BY BRANCH_ID
HAVING SUM(AMOUNT) >= 40000
ORDER BY BRANCH_ID;
SELECT BRANCH_ID, COUNT(*) AS RECORD_CNT, SUM(AMOUNT) AS TOTAL_AMT
FROM BOOK_SALE
WHERE SALE_STATUS = 'PAID'
GROUP BY BRANCH_ID
HAVING COUNT(*) >= 3
ORDER BY BRANCH_ID;
SELECT COUNT(*) AS ALL_SALES
FROM BOOK_SALE
HAVING COUNT(*) >= 8;
SELECT COUNT(*) AS ALL_SALES
FROM BOOK_SALE
HAVING COUNT(*) >= 10;
SELECT BRANCH_ID, SUM(AMOUNT) AS TOTAL_AMT
FROM BOOK_SALE
GROUP BY BRANCH_ID
HAVING SUM(AMOUNT) >= 40000
ORDER BY TOTAL_AMT DESC, BRANCH_ID;