CASE WHEN(CASE ๋ฌธ์ด๋ผ๊ณ ๋ ํ๋ค.)์ SQL์ ์กฐ๊ฑด๋ฌธ์ด๋ค. ๊ธฐ์ค ์ปฌ๋ผ A๊ฐ B๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด C๋ผ๋ ๊ฐ์ ์ถ๋ ฅํ๋ ํํ๋ก 'CASE WHEN A = B THEN C'์ ๊ฐ์ด ํํ๋๋ค. "์กฐ๊ฑด์ ๋ง๋ ๋ต์ ์ถ๋ ฅ"ํ๋ ์์ด์ด์ ์ฃผ๋ก SELECT ์ ์ด๋ ์ง๊ณํจ์์์ ์ฐ์ธ๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ์ผ๋ก ์์ง ์ง๊ณ๋์ง ์์ ์ ์๋ฏธํ ์งํ๋ฅผ ์ฐพ์ ๋ฐํํด ๋ณด๊ณ ์ด๋ฅผ ํตํด CASE WHEN์ SELECT์ ์ฉ๋ก๋ฅผ ์ดํด๋ณด๋ ค ํ๋ค.
์ฌ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค
์๋๋ก ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ค. (mySQL์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ํ์ด๋ค.) ์ฐ๋ฆฌ๋ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ๋ค์ ์ดํด๋ณด๊ณ CASE WHEN์ ํตํด ํ์ฌ ์ด์ ์ ๋ฐ์ ์ ์๋ฏธํ ์ ๋ณด๋ฅผ ๋ง๋ค์ด ๋ณผ ๊ฒ์ด๋ค. ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ์ฌ๋ ๊ฐ์ ํ ์ด๋ธ์ด ์๋ค. customers, employees, offices, orderdetails, orders, payments, productline, products...... ์ด ํ์ฌ์์ ๋ฌด์จ ์ผ์ ํ๋์ง๋ ์์ง ์ ์ ์์ง๋ง ํ๋ก๋ํธ ์ ๋ณด, ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๊ฐ์ง ๊ฒ์ผ๋ก ๋ณด์ ์ด๋ค ํ๋ก๋ํธ๋ฅผ ํ๋งคํ๋ ์ปค๋จธ์ค์์ ์ฐ์ ์ ์ ์๋ค. ๊ทธ๊ฒ ์ ํ์ ์ ํ์ด๋ , ๋ฌดํ์ ์ ํ์ด๋ ๊ฐ์. ์ฐ์ products๋ฅผ ํ ๋ฒ ๋ณผ๊น.
์ ์ฌ์ง์ products์ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ถ ์ถ๋ ฅํ ๊ฒ์ด๋ค. ์ต์ํ ์๋์ฐจ/ ์คํ ๋ฐ์ด ๋ธ๋๋๊ฐ ๋ณด์ด๋๋ฐ, ์ ๋ฐ์ ์ผ๋ก ์์ฒญ ์๋ ๊ฒ์ด๊ณ (productName) ์ฌ๊ณ ์๋๋ ๋๋ฌด ๋ง๋ค. ์ข ๋ ์ดํด ๋ณด๋ productScale์ด๋ผ๋ ์ปฌ๋ผ์ด ์๋ค. 1:10, 1:12...... ์๋์ฐจ ๋ฏธ๋์ด์ฒ๋ฅผ ํ๋ ํ์ฌ์์ ์ ์ ์๋ค. ์ ์กฐ ๋ฒค๋์ฌ(productVender)๊ฐ ์ฌ๋ฟ์ธ ๊ฒ์ผ๋ก ๋ด์ ์ ์กฐ์ฌ๋ณด๋ค๋ ์ ํต์ฌ์ ๊ฐ๊น์ด ํ์ฌ๊ฒ ๋ค.
์ค์ํ ๋ถ๋ถ์ ์ฃผ๋ก ๋ค์ ์๋ค. ์ฌ๊ณ ์๋(quantityInstock), ๊ตฌ๋งค์๊ฐ(buyPrice), ํ๋งค๊ฐ(MSRP). ํ๋งค ๋ฐ์ดํฐ์ ํจ๊ป ๋ณด๋ฉด ๋ฏ์ด๋ณผ ๋ถ๋ถ์ด ๋ง์ ๋ณด์ธ๋ค. ํ์ง๋ง ์ด ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ๋งค ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ํตํด ์ถ์ถํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
๋ค์์ผ๋ก ์ดํด ๋ณผ ํ ์ด๋ธ์ orderdetails ํ ์ด๋ธ์ด๋ค. ์ ํ์ ๊ฐ๋น ๋จ๊ฐ์ ์ฃผ๋ฌธ ์๋์ด ์๊ณ productCode๋ก products ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐ๋ผ ์๋ค. ์ฃผ๋ฌธ ์๋์ด ์ญ ๋์ด๋ผ ์๊ธฐ ๋๋ฌธ์ products์ orders๋ฅผ ํจ๊ป ๋ณด๋ฉด ์ ํ์ ํ๊ท ์ฃผ๋ฌธ ์๋์ด๋ ์ด ๋งค์ถ์ก, ์์ฌ ์ฌ๊ณ ์๋, ์์ ์ฌ๊ณ ๋ฑ์ ํ์ธ์ด ๊ฐ๋ฅํ๊ฒ ๋ค. ์์ฌ์ด ๊ฒ์, ์ฃผ๋ฌธ ์ผ์๊ฐ ์๋ค. ๊ธฐ๊ฐ๋ณ๋ก ๊ทธ๋ฃนํด ๋ณผ ์ ์์ผ๋ ์ ์๋ฏธํ ์ ๋ณด๋ฅผ ๋ง๋ค์ด๋ผ ์๋ ์๋ค. ๊ทธ๋ฌ๋ฉด ํ ์ด๋ธ ํ๋๊ฐ ๋ ํ์ํ๊ฒ ๋ค.
๋ฐ๋ก orders ํ ์ด๋ธ์ด๋ค. ์ด ํ ์ด๋ธ์๋ ์ฃผ๋ฌธ ์ผ์(orderDate)์ ์ฃผ๋ฌธํ ์ฌ๋์ ๊ณ ๊ฐ ๋ฒํธ(customerNumber), ๊ทธ๋ฆฌ๊ณ ์ฃผ๋ฌธ ๋ฒํธ๊ฐ ์ ํ ์๋ค. ํ ์ด๋ธ์ ์ดํด ๋ณด๋ 2003๋ 01์๋ถํฐ 2005๋ 05์๊น์ง์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ผ ์๋ค. ์ด๊ฑธ๋ก ํ์ํ ๋ฐ์ดํฐ๋ ๋ชจ๋ ๋ชจ์์ก๋ค. ์ด์ ๋ฐ์ดํฐ๋ฅผ ์์๊ฒ ๋ค๋ฌ์ด๋ณด์.
INNER JOIN: ์ฌ๋ฌ ํ ์ด๋ธ ๋ชจ์์ ๋ณด๊ธฐ
CASE WHEN์ ์กฐ๊ฑด์ ๋ค๋ ๋ฐ ์๋ ์ ํ์ด ์๋ค. ์ํ๋ ์๋๋งํผ ์ถฉ๋ถํ ๋ง๋ถ์ผ ์ ์๋จ ์๋ฆฌ๋ค. SELECT ์ ์์ CASE WHEN์ ์ฌ์ฉํ๋ฉด ์๋ก์ด ์ปฌ๋ผ์์ ๊ตฌ๊ฐ์ ๋ง์ถฐ ๊ฐ์ ๋ค์ ๋ถ์ฌํจ์ผ๋ก์จ ๋ก์ฐ๋ค์ ์ธ๋ถํํ ์ ์๋ค. ํ์ง๋ง ํ ํ ์ด๋ธ์์๋ง ์งํํ๊ธฐ๋ ์กฐ๊ธ ์ด๋ ต๋ค. ๊ฐ ์ ๋ณด๊ฐ์ด ๋ ํ ์ด๋ธ์์ ๊ณต์ ํ๋ ๊ฐ(๊ธฐ๋ณธํค)์ ๊ธฐ์ค์ผ๋ก ๋๋ ์ ธ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ํ ๋ฉด, orderdetails์์๋ ์ ํ์ ๊ฐ๊ณผ ์ฃผ๋ฌธ ์๋์ด ์์ง๋ง ์ฃผ๋ฌธ ์ผ์์ ์ฃผ๋ฌธ์๋ช ์ด ์๋ค. ์ด ๋ ์ ๋ณด๊ฐ์ orders ํ ์ด๋ธ์์ ๊ฐ์ ธ์์ผ ํ๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ด์ ํฌ์คํธ์์ JOIN์ ๊ดํด ๋ฐฐ์ ๋ค. INNER JOIN์ ํ์ฉํ๋ฉด ๊ฐ๊ธฐ ๋ ํ ์ด๋ธ์์ ์ํ๋ ์ปฌ๋ผ์ ๊ฐ๊ฐ ๊ฐ์ ธ์ ์ฌ์กฐ๋ฆฝํด SELECT ํ ์ ์๋ค. ์๋์ ๊ฐ์ด ๋ง์ด๋ค.
SELECT ods.orderDate
, ods.customerNumber
, odd.orderNumber
, odd.productCode
, odd.quantityOrdered
, odd.priceEach
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
์ด๋ ๊ฒ INNER JOIN์ผ๋ก ์ ๋ณด๋ฅผ ๊ฐ๊ฐ ๊ฐ์ ธ์ ์ฃผ๋ฉด, ์ผ์๋ณ๋ก ์ด๋ค ์ํ์ด ๋๊ตฌ์๊ฒ ์ผ๋ง๋ ํ๋ ธ๋์ง ์ ์ ์๋ค. ์ด ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก 2003๋ ๊ธฐ์ค์ผ๋ก ์ ํ๋ณ ๋งค์ถ ์์๋ฅผ ๋ฝ์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
WHERE, GROUP BY: 1๋ ์น ์ ํ๋ณ ๋งค์ถ ์์ ๋ฝ๊ธฐ
SELECT ods.orderDate
, ods.customerNumber
, odd.orderNumber
, odd.productCode
, odd.quantityOrdered
, odd.priceEach
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
ORDER BY productCode;
WHERE ์ ์ ์กฐ๊ฑด์ ํ๋ ๋ ์ถ๊ฐํด ์คฌ๋ค. 2003๋ ์ผ๋ก ์์ํ๋ ๋ฌธ์์ด ์ ์ฒด๋ฅผ ๋ฐํํ๋ ์กฐ๊ฑด์ด๋ค. ORDER BY๋ productCode๋ก ์คฌ๋ค. ์ ํ ์ฝ๋ ๋ณ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋ ๊ฒ ๋ณด์ธ๋ค. (์๊ธฐ๋ ๊ณ ๊ฐ ์ง๋จ์ ์ฐจ์ด์ ๋ฐ๋ผ ์ต์ข ํ๋งค๊ฐ๋ ์ค๋ฅด๋ด๋ฆฌ๋ ๊ฒ ๋ณด์ธ๋ค.) ์ฌ๊ธฐ๋ค ์ํ๋ณ ์ฐ๋งค์ถ์ก์ ๋ฝ๊ณ ์ ๋ ฌํด ์ฃผ๋ฉด ์์๊ฒ ๋ณผ ์ ์๊ฒ ๋ค.
SELECT productCode
, ROUND(AVG(priceEach), 2) AS avg_priceEach
, SUM(quantityOrdered) AS sum_quantity
, (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
GROUP BY productCode
ORDER BY year_sales DESC;
ํจ์ฌ ๋ณด๊ธฐ ํธํด์ก๋ค. ์ฌ๊ธฐ์ ๋ค ์ ์๋ ์๋ฌธ์ ํด์ํ๊ณ ๊ฐ๊น. ์ priceEach๋ ํ๊ท ์ ๊ตฌํ๊ณ quantity๋ ํฉ๊ณ ๊ฐ์ ๊ตฌํ๋๊ฐ๊ฐ ๊ถ๊ธํ ์ ์๋ค. ๊ทธ๊ฑด priceEach๊ฐ ๊ตฌ๋งค์ก(๊ฐ๋น ๋จ๊ฐ*์๋)์ด ์๋๋ผ ๊ฐ๋น ๋จ๊ฐ์ฌ์ ๊ทธ๋ ๋ค. ํด๋น ํ์ฌ์ ๊ฒฝ์ฐ ๋๋งค๋ก๋ง ๊ฑฐ๋ํ๊ธฐ ๋๋ฌธ์ ์ ํ ๊ฐ๊ฒฉ์ด ๊ณ ์ ๋์ด ์์ง ์๊ณ ํ์ ์ฌ๋ถ์ ์ํฉ์ ๋ฐ๋ผ ์ ๋์ ์ผ๋ก ๋จ๊ฐ๊ฐ ์กฐ์ ๋๋ค. ๊ทธ๋์ ์ฐ๋งค์ถ, year_sales๋ฅผ ๋ฝ๊ธฐ ์ํด์๋ ์ด ๊ฐ๋น ์คํ๋งค๊ฐ์ ํ๊ท ๊ณผ ํ๋งค ๊ฐ์๋ฅผ ๊ณฑํด์ผ๋ง ํ๋ค.
CASE WHEN: ์ํ ์ธ๋ถํํด์ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ๋ก๋ชจ์ ์ ๋ต ์ง๊ธฐ
๋ณด๋ฉด ์๊ฒ ์ง๋ง, ๋งค์ถ 1์ ์ํ๊ณผ 2์ ์ํ์ ํธ์ฐจ๊ฐ ํฌ๋ค. ์ญ ๋ด๋ ค๋ณด๋ฉด ๋ง์์ ์ํ์ 1๋ง ๋ฌ๋ฌ ์ ๋๋ก 1์์ ๊ฑฐ์ 10๋ฐฐ ๊ฐ๋ ๋งค์ถ ์ฐจ์ด๊ฐ ๋๋๋ฐ ์์๊ถ ์ํ ๋๋นํด์ ์ ํ ๋จ๊ฐ๋ ๋ฎ๊ณ ํ๋งค ์๋ ์ข ๋ถ์งํ๋ค. ์ ๋ฐ์ ์ผ๋ก ๋ณด๋ฉด ๊ทธ๋ฃน๋ณ๋ก ๋๋ ์ ๊ด๋ฆฌํด์ค์ผ ํ ํ์๊ฐ ์๋ค.
SELECT productCode
, ROUND(AVG(priceEach), 2) AS avg_priceEach
, SUM(quantityOrdered) AS sum_quantity
, (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales
, ROW_NUMBER ()
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
) AS sales_rank
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
GROUP BY productCode
ORDER BY year_sales DESC;
year_sales๋ฅผ ์กฐ๊ธ ๋ ์ง๊ด์ ์ผ๋ก ๋ณด๊ณ , ์ฐจํ์ ๋ค๋ฅธ ๋ ๋๋ณ ์ธ๋ถํ ์งํ ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ์์๋ฅผ ๋จผ์ ๋ฝ์๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ํ์ 'high', 'medium', 'low' ์ธ ๊ฐ์ง ์ง๋จ์ผ๋ก ๋๋ ๋ณผ ๊ฒ์ด๋ค. 'high'๋ ๋งค์ถ ์์๊ถ์ผ๋ก ์ฌ๊ณ ๋ฅผ ์ง์ ๊ด๋ฆฌํด์ค์ผ ํ๋ฉฐ ํ๋งค ๋ํฅ์ ์ง์์ ์ผ๋ก ์ฒดํฌํด์ผ ํ ์์ ์ญ ํผ์ผํธ, ๋ฐ๋๋ก 'low'๋ ์ฌ๊ณ ๊ฐ ๊ณผ๋คํ๋ค๋ฉด ์ต์ฐ์ ์ผ๋ก ์์งํ๊ณ ์ฌ๊ณ ๋ฅผ ๊ฐ์ถ ์ด์ํด์ผ ํ ํ์ ์ญ ํผ์ผํธ๋ค.
ํผ์ผํธ๋ฅผ ์ง์ ์ง๊ณํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ง๊ณ ์ถ์๋๋ฐ ์์นญ ์ค๋ ฅ์ด ๋ถ์กฑํ๋ ๊ฑด์ง ๊ฒฐ๊ตญ ๋ชป ์ฐพ์์, ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ 10์ผ๋ก ๋๋ ์ ์ ์๋๋ก 11์์ฉ ๋นผ ์คฌ๋ค(...)
SELECT productCode
, ROUND(AVG(priceEach), 2) AS avg_priceEach
, SUM(quantityOrdered) AS sum_quantity
, (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales
, ROW_NUMBER ()
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
) AS sales_rank
, CASE
WHEN ROW_NUMBER ()
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
) BETWEEN 1 AND 11 THEN 'high'
WHEN ROW_NUMBER ()
OVER (
ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC
) BETWEEN 98 AND 109 THEN 'low'
ELSE 'medium'
END AS sales_seg
FROM orderdetails odd, orders ods
WHERE odd.orderNumber = ods.orderNumber
AND orderDate LIKE '2003%'
GROUP BY productCode;
๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๋์๋ค! ๊ฐ๋ ์ฑ ์ํด BETWEEN์ผ๋ก ๊ฐ์ ์ง์ ํด ์คฌ๋๋ฐ ์ฐ์ฐ๋ถํธ๋ก ์ก์ ์ค๋ ๋ฌด๋ฐฉํ๊ฒ ๋ค. ๊ตณ์ด ์์๋ฅผ ์ง๊ณํ ๊น๋ญ์ ์ดํ์ ์ผ์ผ์ด ๋ฒ์๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ด์๋ค. year_sales๋ฅผ ์กฐ๊ฑด์ผ๋ก ์ก๋ค ๋ณด๋ ๋ง์ด ๊ธธ์ด์ก๋๋ฐ, ๋ ํจ์จ ์ข๊ฒ ์งค ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ถ๋ช ์์ง ์๋ ์ถ๋ค. ์ฐจํ ์๊ฒ ๋๋ฉด ์์ ๋ง๋ถ์ฌ ๋ณด๊ฒ ๋ค.
CASE WHEN์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ด ๋ช ๊ฐ์ง ์๋ค. 1) ์์ ์กฐ๊ฑด์ด ์ฐ์ ์์๋ก ์กํ ์์ด์ ์ฐ์ ์์ ์ค์ ์ ๊ฒน์น์ง ์๊ฒ ๋ฃ์ด ์ค์ผ ํ๋ค๋ ๊ฑฐ. ๋ง์ฝ์ ์ ์ฟผ๋ฆฌ๋ฅผ ์ฐ์ฐ๊ธฐํธ๋ก ์กฐ๊ฑด์ ๊ฒน์น ์ ์๊ฒ ์ก์ ๋๋ค๋ฉด ๋จผ์ ์ ์ธ๋ ํ ๊ฐ์ง ์ง๋จ์ ๊ฐ๋ค์ด ๋ค ๋ชฐ๋ ค ๋ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค. ํด๋น ๋ฌธ๋ฒ์ ํ ๋ฒ ํฌํจ๋ ์ดํ์ ๋ง์กฑ ์กฐ๊ฑด์ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ด๋ค. 2) ELSE๋ฅผ ๋ฃ์ง ์์๋ ๋์ํ์ง๋ง ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด ์ธ๋ถํ๋์ง ์๋ ๋ก์ฐ๋ ์ ๋ถ ๋ค NULL ๊ฐ์ด ๋ค์ด๊ฐ๋ค๋ ๊ฑฐ๋ค. ํด๋น ๋ ๊ฐ์ง๋ฅผ ์ฃผ์ํด์ ์ง ์ฃผ์.
์ฐธ๊ณ
'TOOLS > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL ๋ฌธ์ ํ์ด: ๊ฐ๊ฒฉ๋๋ณ ๊ทธ๋ฃน ์ฝ๊ฒ ๋ง๋ค๊ธฐ, FLOOR/ TRUNCATE (0) | 2024.02.17 |
---|---|
SQL: ์ NULL์ =์ด ์๋๋ผ is๋ฅผ ์ธ๊น (1) | 2024.02.11 |
SQL: ์ค๋ณต ๊ฐ๋ง ๋ฆฌ์คํ ํ๋ ๋ฐฉ๋ฒ, HAVING COUNT() (0) | 2024.02.06 |
SQL: ์ ์ ์ด๋ ์ฐจ์ด์ ์ด๋ ๋ชจ์ ๋์ผ ๋ณด์ธ๋ค, JOIN (1) | 2024.02.03 |
SQL: ํ์ ๋ฌธ๋ฒ ๋ชจ์ ์ํธ (1) | 2024.01.30 |