๐ ๋ณธ ํฌ์คํ ์์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์๋ฃ์ ์ถ์ฒ๋ HackerRank ์์ ๋ฐํ๋๋ค. ๋ ๋ค์ํ SQL ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ ค๋ฉด
HackerRank ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํด ๋ณด์ธ์!
์ด๋ฒ ํฌ์คํ
์์๋ ํด์ปค๋ญํฌ ๋ฌธ์ ์ New Companies ๋ฌธ์ ํ์ด์ ๋ํด ์๊ฐํ๋ ค๊ณ ํ๋ค. ํ์๊ฐ ์ง์ ํ์ดํ๋ ์ฐ์์ ์ธ JOIN
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ Discussion์ ์กด์ฌํ๋ ๋ค๋ฅธ ๋ถ์ JOIN
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์์ ํ์ด๋ ์๊ฐํด๋ณด๋ ค ํ๋ค. ์ด๋ฒ ๋ฌธ์ ๋ ์ฃผ์ด์ง ํ
์ด๋ธ ๊ฐ์๋ ์ฌ๋ฌ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํฌ์คํ
์์ ์๊ฐํ๋ค๋ฉด ๋๋ฌด ๋ฒ์กํด์ง ๊ฒ ๊ฐ์ ๋ฌธ์ ์ ๋ํ ์ดํด๋ ์๋ณธ ๋ฌธ์ ์ธ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์.
์๋ณธ ๋ฌธ์ ๋ฅผ ์ฝ๊ณ ๋๋ฉด ๋ฌธ์ ์์ ์๊ตฌํ๋ ์ฌํญ์ด ์ ํํ ๋ฌด์์ธ์ง ํ์
ํ ์ ์๋ค. ๊ฐ Company์ Company_code
, Founder
, ๊ฐ ํ์ฌ์ Lead Manager
, Senior Manager
, Manager
, Employee
๋ช
์๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ค. ์ด ๋ ๋ฐ์ดํฐ ์ ๋ ฌ ๊ธฐ์ค์ Company์ Company_code
๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋๋ฐ, Company_code
๊ฐ์ด ๋ฌธ์์ด ํํ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ซ์๊ฐ ๋ค์ด์๋๋ผ๋ ๋ฌธ์์ด ์ทจ๊ธ์ ํด์ฃผ์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด Company_code
๊ฐ๋ค์ด ์ฃผ์ด์ก๋ค๊ณ ์น์.
Code |
A_10 |
A_1 |
B_3 |
B_12 |
์ ๊ฐ๋ค์ ๋ฌธ์ ์์ ์๊ตฌํ๋ ํํ๋ก ์ ๋ ฌํ๊ฒ ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฌ์ด ๋๋ค.
Code |
A_1 |
A_10 |
B_12 |
B_3 |
1. ์ฐ์์ ์ธ INNER JOIN ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ํ์ด๋ณด๊ธฐ
๋ฌธ์ ๋ฅผ ํ์ดํ ๋ ๊ฐ์ฅ ์ง์คํ๋ ๋ถ๋ถ์ ๋ชจ๋ ํ
์ด๋ธ์ ๊ณตํต์ ์ผ๋ก ๋ค์ด๊ฐ ์๋ ์นผ๋ผ์ด Company_code
์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ Company_code
๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ณ์์ ์ผ๋ก INNER JOIN
์ ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ INNER JOIN
์ํฌ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ๊ตฌํ๊ณ ์ ํ๋ ๊ฐ ๋งค๋์ ๋ค, ์ง์์ COUNT
๊ฐ์ ์ง๊ณํ๋ค. ์ฐธ๊ณ ๋ก DISTINCT
ํ ์ด์ ๋ ๋ฌธ์ ์์ ์ค๋ณต๋(duplicated) ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ๋ช
์ํด์ฃผ์๊ธฐ ๋๋ฌธ์ด๋ค.
SELECT company.company_code, company.founder, lead.lead_count, senior.senior_count,
manager.manager_count, employee.employee_count
FROM company
INNER JOIN (SELECT company_code, COUNT(DISTINCT(lead_manager_code)) AS lead_count
FROM lead_manager
GROUP BY company_code) lead ON company.company_code = lead.company_code
INNER JOIN (SELECT company_code, COUNT(DISTINCT(senior_manager_code)) AS senior_count
FROM senior_manager
GROUP BY company_code) senior ON company.company_code = senior.company_code
INNER JOIN (SELECT company_code, COUNT(DISTINCT(manager_code)) AS manager_count
FROM manager
GROUP BY company_code) manager ON company.company_code = manager.company_code
INNER JOIN (SELECT company_code, COUNT(DISTINCT(employee_code)) AS employee_count
FROM employee
GROUP BY company_code) employee ON company.company_code = employee.company_code
ORDER BY company.company_code
2. WHERE ๊ตฌ๋ฌธ๋ง์ ์ฌ์ฉํด์ ํ์ด๋ณด๊ธฐ
์ด ํ์ด๋ ๋ฌธ์ ์ Discussion ํญ์์ ๋ณด๊ฒ ๋ ํ์ด์ธ๋ฐ, INNER JOIN
์ ์ฌ์ฉํ์ง ์์๋ค๋ ์ ์ด ์ธ์์ ์ด์๋ค. ๋ ๊ทธ๋์์ FROM
์ ๋ค์๋ 1๊ฐ์ ํ
์ด๋ธ๋ง ๋์์ผ ํ๋ค๊ณ ๋น์ฐํ๊ฒ ์๊ฐํ์๋๋ฐ ์ด๋ฌํ ๊ณ ์ ๊ด๋
(?)์ ๊นจ๋จ๋ฆฌ๋ ํ์ด์๊ธฐ๋ ํ๋ค. ํ์ด๋ฅผ ์ดํด๋ณด์.
SELECT c.company_code, c.founder,
COUNT(DISTINCT(l.lead_manager_code)), COUNT(DISTINCT(s.senior_manager_code)),
COUNT(DISTINCT(m.manager_code)), COUNT(DISTINCT(e.employee_code))
FROM company c, lead_manager l, senior_manager s, manager m, employee e
WHERE c.company_code = l.company_code AND
l.lead_manager_code = s.lead_manager_code AND
s.senior_manager_code = m.senior_manager_code AND
m.manager_code = e.manager_code
GROUP BY c.company_code, c.founder
ORDER BY c.company_code
ํ์ด๋ฅผ ๋ณด๊ฒ๋๋ฉด FROM
์ ์ 5๊ฐ์ ํ
์ด๋ธ์ ๋ชจ๋ ๋ช
์ํด์ค ์ ์์์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ WHERE
์ ์๋ ์์ ๋ช
์ํด์ฃผ์๋ 5๊ฐ์ ํ
์ด๋ธ๋ค์ด ์๋ก ๊ตฌํ๊ณ ์ถ์ดํ๋ ๋งค๋์ , ์ง์๋ค code ๊ฐ์ด ๊ฐ๋๋ก ์กฐ๊ฑด์ ๋ถ์ฌ์ฃผ์๋ค.
๋ง์ง๋ง์ผ๋ก ๊ตฌํ๊ณ ์ ํ๋ ๊ฒ์ด ๊ฐ์ Company_code
์ ์ํ๋ ๋งค๋์ ๋ค๊ณผ ์ง์๋ค์ ๋ช
์๋ฅผ ๊ตฌํ๋ ค ํ๋ ๊ฒ์ด๊ณ ์ถ๋ ฅ ์ ๊ทธ Company์ Founder
๋ ์ถ๋ ฅํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ Company_code
, Founder
์ด 2๊ฐ์ ์นผ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ์ ํด์ผ ํ๋ค.