SQL

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค level 4] ์˜คํ”„๋ผ์ธ/์˜จ๋ผ์ธ ํŒ๋งค ๋ฐ์ดํ„ฐ ํ†ตํ•ฉํ•˜๊ธฐ

1eehyunji 2023. 7. 31. 22:14

๋ฌธ์ œ ์„ค๋ช…

๋‹ค์Œ์€ ์–ด๋А ์˜๋ฅ˜ ์‡ผํ•‘๋ชฐ์˜ ์˜จ๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ์ •๋ณด๋ฅผ ๋‹ด์€ ONLINE_SALE ํ…Œ์ด๋ธ”๊ณผ ์˜คํ”„๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ์ •๋ณด๋ฅผ ๋‹ด์€ OFFLINE_SALE ํ…Œ์ด๋ธ” ์ž…๋‹ˆ๋‹ค. ONLINE_SALE ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE๋Š” ๊ฐ๊ฐ ์˜จ๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ID, ํšŒ์› ID, ์ƒํ’ˆ ID, ํŒ๋งค๋Ÿ‰, ํŒ๋งค์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column nameTypeNullable

ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

๋™์ผํ•œ ๋‚ ์งœ, ํšŒ์› ID, ์ƒํ’ˆ ID ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

OFFLINE_SALE ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE๋Š” ๊ฐ๊ฐ ์˜คํ”„๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ID, ์ƒํ’ˆ ID, ํŒ๋งค๋Ÿ‰, ํŒ๋งค์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Column nameTypeNullable

OFFLINE_SALE_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

๋™์ผํ•œ ๋‚ ์งœ, ์ƒํ’ˆ ID ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


๋ฌธ์ œ

ONLINE_SALE ํ…Œ์ด๋ธ”๊ณผ OFFLINE_SALE ํ…Œ์ด๋ธ”์—์„œ 2022๋…„ 3์›”์˜ ์˜คํ”„๋ผ์ธ/์˜จ๋ผ์ธ ์ƒํ’ˆ ํŒ๋งค ๋ฐ์ดํ„ฐ์˜ ํŒ๋งค ๋‚ ์งœ, ์ƒํ’ˆID, ์œ ์ €ID, ํŒ๋งค๋Ÿ‰์„ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. OFFLINE_SALE ํ…Œ์ด๋ธ”์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ์˜ USER_ID ๊ฐ’์€ NULL ๋กœ ํ‘œ์‹œํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ํŒ๋งค์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์‹œ๊ณ  ํŒ๋งค์ผ์ด ๊ฐ™๋‹ค๋ฉด ์ƒํ’ˆ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ, ์ƒํ’ˆID๊นŒ์ง€ ๊ฐ™๋‹ค๋ฉด ์œ ์ € ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

 

๋ฌธ์ œํ’€์ด

SELECT * FROM 
(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 
FROM ONLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT 
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03%')TOTAL
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

์šฐ์„  ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ 2022๋…„ 3์›” ๊ตฌ์ž…ํ•œ ํŒ๋งค ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ–ˆ๋‹ค. 

LIKE-์™€์ผ๋“œ์นด๋“œ ์กฐํ•ฉ์œผ๋กœ 2022๋…„ 3์›” ๊ตฌ์ž…ํ•œ ํŒ๋งค ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ , SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT๋ฅผ ์ถ”์ถœํ–ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ , OFFLINE_SALE ํ…Œ์ด๋ธ”์—์„œ ONLINE_SALE ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•œ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„๋ƒˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ USER_ID๋Š” ๊ธฐ์กด์˜ OFFLINE_SALE ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ, NULL๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— NULL AS USER_ID๋กœ NULL ๋ฐ์ดํ„ฐ๋“ค์„ USER_ID ๋ผ๋Š” ์ปฌ๋Ÿผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ๋‘ ํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ์ฃผ๋Š” UNION ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,

UNION ์—ฐ์‚ฐ์—๋Š” UNION ALL๊ณผ UNION์ด ์žˆ๋‹ค. ๋‘ ์—ฐ์‚ฐ์˜ ์ฐจ์ด์ ์€ ์ค‘๋ณต ์ฒ˜๋ฆฌ ์—ฌ๋ถ€์™€ ๋‘ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋จผ์ € UNION์€ ๋‘ ํ…Œ์ด๋ธ”์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœํ•œ๋‹ค. ์ฆ‰, ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‘ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด ๊ฐ™์•„์•ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ํ•œ ํ…Œ์ด๋ธ”์ด A,B๋ผ๋Š” ์ปฌ๋Ÿผ์„ ๊ฐ€์ง€๋Š”๋ฐ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์ด A,B,C ์ปฌ๋Ÿผ์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  UNION ALL์€ ๋‘ ํ…Œ์ด๋ธ”์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ปฌ๋Ÿผ์ด ๋‹ค๋ฅด๋”๋ผ๋„ ํ•ฉ์ณ์ค„ ์ˆ˜ ์žˆ๋‹ค. 

 

์ด ๋ฌธ์ œ์—์„  ๋‘ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด ๋™์ผํ•˜๊ณ , ๋™์ผํ•œ ๋‚ ์งœ, ์ƒํ’ˆ ID ์กฐํ•ฉ์— ๊ด€ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•˜๋ฏ€๋กœ UNION์„ ์‚ฌ์šฉํ•ด์ค˜๋„ ์ •๋‹ต ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ํ•ฉ์นœ ๋‘ ํ…Œ์ด๋ธ”์„ 'TOTAL'์ด๋ผ๋Š” ๋ณ„์นญ์œผ๋กœ ALIASํ•ด์ฃผ๊ณ , ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ SELECT ... FROM ...์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ORDER BY๋กœ ์ ์ ˆํ•˜๊ฒŒ ์ •๋ ฌํ•ด์ค€๋‹ค.