Claire's Study Note

[SQL Fundamentals] 04. Group By์™€ ์ง‘๊ณ„ ํ•จ์ˆ˜(Aggregate Function)

by Hi.Claire
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ๏ธ ๋ฐ์ดํ„ฐ ๋ถ„์„ SQL Fundamentals (๊ถŒ์ฒ ๋ฏผ, ์ธํ”„๋Ÿฐ)

 

์„น์…˜4. Group By์™€ ์ง‘๊ณ„ ํ•จ์ˆ˜ (Aggregate Function)

4-1. Group By์˜ ์ดํ•ด

Group By

Group By ์ ˆ์— ๊ธฐ์ˆ ๋œ ์ปฌ๋Ÿผ ๊ฐ’(๋˜๋Š” ๊ฐ€๊ณต ์ปฌ๋Ÿผ๊ฐ’)์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•œ ๋’ค ์ง‘๊ณ„ ํ•จ์ˆ˜ (Aggregation Function)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ๊ทธ๋ฃนํ™”๋œ ์ง‘๊ณ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ Group By ์ ˆ์— ๊ธฐ์ˆ ๋œ ์ปฌ๋Ÿผ๊ฐ’์œผ๋กœ ๋ฐ˜๋“œ์‹œ 1์˜ ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

select ์ ˆ์—๋Š” Group By ์ ˆ์— ๊ธฐ์ˆ ๋œ ์ปฌ๋Ÿผ(๋˜๋Š” ๊ฐ€๊ณต ์ปฌ๋Ÿผ)๊ณผ ์ง‘๊ณ„ ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

 

(์‚ฌ์šฉ๋ฒ•)

SELECT <column(s)>
FROM <table>
WHERE <condition>        -- group by ํ•  ๋Œ€์ƒ์˜ filtering ์กฐ๊ฑด
GROUP BY <column(s)>     -- group by ์ ์šฉํ•  ์ปฌ๋Ÿผ๋ช…
HAVING <condition>       -- group by ๊ฒฐ๊ณผ์˜ filtering ์กฐ๊ฑด
ORDER BY <columns(s)>;

 

(์˜ˆ์‹œ) emp ํ…Œ์ด๋ธ”์˜ group by ์˜ˆ์‹œ

1
2
3
4
5
6
select deptno, sum(sal) as sum_sal
from hr.emp
where job != 'SALARYMAN'
group by deptno
having avg(sal) > 2000
order by deptno;
 

 

์œ„์˜ ์˜ˆ์‹œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ filtering ๋˜๋Š” ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด์ž.

๋จผ์ € WHERE ์ ˆ์— ์˜ํ•ด job์ด 'SALARYMAN'์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๊ฐ€ 1์ฐจ์ ์œผ๋กœ filtering ๋œ๋‹ค.

๊ทธ ๋‹ค์Œ Group By ์ ˆ์— ์˜ํ•ด deptno๋กœ ๊ทธ๋ฃนํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ having ์ ˆ์— ์˜ํ•ด sal์˜ ํ‰๊ท ๊ฐ’์ด 2000 ์ด์ƒ์ธ ๊ทธ๋ฃน๋“ค๋กœ ํ•œ ๋ฒˆ ๋” filtering๋œ๋‹ค.

 

Group By ์ ์šฉ ๋กœ์ง

 

 

 

 

์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด Group By๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

 

(์˜ˆ์‹œ) emp ํ…Œ์ด๋ธ”์˜ group by ์˜ˆ์‹œ

1
2
3
4
select deptno, count(*) as emp_count, sum(sal) as sum_sal, round(avg(sal),3) as avg_sal, max(sal) as max_sal
from hr.emp
group by deptno
order by deptno;

 

 

emp ํ…Œ์ด๋ธ”์˜ PK๋Š” empno๋‹ค.

์ฆ‰, emp ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋Š” empno์— ๋Œ€ํ•ด uniqueํ•˜๋ฉฐ, empno๋กœ 1์˜ ์ง‘ํ•ฉ์„ ๊ฐ€์ง„๋‹ค.

ํ•˜์ง€๋งŒ group by๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด์„œ ํ•ด๋‹น ์ง‘ํ•ฉ์ด ๋ญ‰๊ทธ๋Ÿฌ์ง€๊ฒŒ ๋˜๋ฉฐ, group by ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ deptno๋ฅผ PK๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

์ฆ‰, group by ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ deptno๋กœ uniqueํ•˜๋ฉฐ, deptno๋กœ 1์˜ ์ง‘ํ•ฉ์„ ๊ฐ€์ง„๋‹ค.

 

4-2. Group By ์‹ค์Šต

์‹ค์Šต ์˜ˆ์ œ

1. emp ํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ๋ณ„ ์ตœ๋Œ€ ๊ธ‰์—ฌ, ์ตœ์†Œ ๊ธ‰์—ฌ, ํ‰๊ท  ๊ธ‰์—ฌ๋ฅผ ๊ตฌํ•˜๋˜ ํ‰๊ท  ๊ธ‰์—ฌ๊ฐ€ 2000 ์ด์ƒ์ธ ๊ฒฝ์šฐ๋งŒ ์ถ”์ถœ

1
2
3
4
5
select deptno, max(sal) as max_sal, min(sal) as min_sal, round(avg(sal),2) as avg_sal
from emp
group by deptno
having avg(sal) >= 2000
order by deptno;
 
 

 

round(val [, n])

postgreSQL ๋ฐ˜์˜ฌ๋ฆผ ํ•จ์ˆ˜

์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ : ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์ง„ ๊ฐ’์„ ๋ฐ˜์˜ฌ๋ฆผํ•œ ๋’ค ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ˆ˜๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ, ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ : ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์ง„ ๊ฐ’์„ ๋ฐ˜์˜ฌ๋ฆผํ•œ ๋’ค ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์ง„ ๊ฐ’๋งŒํผ ์†Œ์ˆ˜์  ์•„๋ž˜ ์ž๋ฆฌ์ˆ˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

(์˜ˆ์‹œ1) round(avg(sal))

avg(sal)์„ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ˆ˜๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

(์˜ˆ์‹œ2) round(avg(sal), 2)

avg(sal)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์†Œ์ˆ˜์  ์•„๋ž˜ 2์ž๋ฆฌ๊นŒ์ง€ ํ‘œ์‹œํ•œ๋‹ค.

 

2. emp ํ…Œ์ด๋ธ”์—์„œ ๋ถ€์„œ๋ณ„ ์ตœ๋Œ€ ๊ธ‰์—ฌ, ์ตœ์†Œ ๊ธ‰์—ฌ, ํ‰๊ท  ๊ธ‰์—ฌ๋ฅผ ๊ตฌํ•˜๋˜ ํ‰๊ท  ๊ธ‰์—ฌ๊ฐ€ 2000 ์ด์ƒ์ธ ๊ฒฝ์šฐ๋งŒ ์ถ”์ถœ (with ์ ˆ์„ ์ด์šฉ)

1
2
3
4
5
6
7
8
9
with 
temp as (
select deptno, max(sal) as max_sal, min(sal) as min_sal, round(avg(sal),2) as avg_sal
from emp
group by deptno
)
select deptno, max_sal, min_sal, avg_sal
from temp
where avg_sal >= 2000;
 
 

 

3. ๋ถ€์„œ๋ช… SALES์™€ RESEARCH ์†Œ์† ์ง์›๋ณ„๋กœ ๊ณผ๊ฑฐ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€ ๋ชจ๋“  ๊ธ‰์—ฌ๋ฅผ ์ทจํ•ฉํ•œ ํ‰๊ท  ๊ธ‰์—ฌ ๊ตฌํ•˜๊ธฐ

1
2
3
4
5
6
7
select b.empno, max(b.ename) as ename, round(avg(c.sal),2) as avg_sal
from hr.dept a
    join hr.emp b on a.deptno = b.deptno
    join hr.emp_salary_hist c on b.empno = c.empno
where a.dname in('SALES''RESEARCH')
group by b.empno
order by 1;
 
 

 

(ํ’€์ด ์ˆœ์„œ)

1) ๋ถ€์„œ๋ช… SALES, RESEARCH ๋ฐ์ดํ„ฐ๋งŒ filtering ํ•œ๋‹ค.

from hr.dept a

where a.dname in('SALES', 'RESEARCH')

 

2) join์„ ํ†ตํ•ด ํ•ด๋‹น ๋ถ€์„œ ์†Œ์† ์ง์› ์ •๋ณด์™€ ์ง์›์˜ ๊ธ‰์—ฌ์ด๋ ฅ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

from hr.dept a
    join hr.emp b on a.deptno = b.deptno
    join hr.emp_salary_hist c on b.empno = c.empno

 

3) group by๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ empno๋กœ 1์˜ ์ง‘ํ•ฉ์ด ๋˜๋„๋ก ํ•œ๋‹ค.

group by b.empno

 

4) ์ง‘๊ณ„ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์ง‘๊ณ„์„ฑ ์ •๋ณด๋ฅผ ๊ตฌํ•œ๋‹ค.

select b.empno, max(b.ename) as ename, round(avg(c.sal),2) as avg_sal

group by b.empno

 

4. ๋ถ€์„œ๋ช… SALES์™€ RESEARCH ์†Œ์† ์ง์›๋ณ„๋กœ ๊ณผ๊ฑฐ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€ ๋ชจ๋“  ๊ธ‰์—ฌ๋ฅผ ์ทจํ•ฉํ•œ ํ‰๊ท  ๊ธ‰์—ฌ ๊ตฌํ•˜๊ธฐ (with ์ ˆ๋กœ ํ’€๊ธฐ)

1
2
3
4
5
6
7
8
9
10
11
12
13
with 
temp as (
select e.empno, e.ename, esh.fromdate, esh.todate, esh.sal
from dept d
    join emp e on d.deptno = e.deptno
    join emp_salary_hist esh on e.empno = esh.empno
where d.dname in ('SALES''RESEARCH')
)
select empno, max(ename), round(avg(sal),2) as avg_sal
from temp
group by empno
order by 1
;
 
 

 

์ด๋•Œ, select ์ ˆ์—๋Š” group by ์ ˆ์— ๊ธฐ์ˆ ๋œ ์ปฌ๋Ÿผ(๋˜๋Š” ๊ฐ€๊ณต์ปฌ๋Ÿผ)์ด๋‚˜ ์ง‘๊ณ„ ํ•จ์ˆ˜๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง์› ์ด๋ฆ„(ename)์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ง‘๊ณ„ ํ•จ์ˆ˜ max()๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

(์ฐธ๊ณ ) group by ๊ธฐ์ค€ ์ปฌ๋Ÿผ์ด empno์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ์ง‘ํ•ฉ์ด empno์— ๋Œ€ํ•ด uniqueํ•œ ์ง‘ํ•ฉ์ž„์„ ์•Œ๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง์› ์ด๋ฆ„์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ์‹ฌํ•˜๊ณ  max()ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ๊ทธ๋ƒฅ ename์ด๋ผ๊ณ  ์“ด ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

(์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€) SQL Error [42803]: ERROR: column "temp.ename" must appear in the GROUP BY clause or be used in an aggregate function

 

4-3. ์ง‘๊ณ„ ํ•จ์ˆ˜ (Aggregate Function)์™€ count (distinct)์˜ ์ดํ•ด

์ง‘๊ณ„ ํ•จ์ˆ˜ (Aggregate Function)

count(*)

์ •ํ•ด์ง„ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์—์„œ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ด

 

count(distinct ์ปฌ๋Ÿผ๋ช…)

์ •ํ•ด์ง„ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์—์„œ ํ•ด๋‹น ์ปฌ๋Ÿผ์œผ๋กœ ์ค‘๋ณต์„ ๋ฐฐ์ œํ•˜๊ณ  ๊ณ ์œ ํ•œ ๊ฑด์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ด

 

sum(์ปฌ๋Ÿผ๋ช…)

์ •ํ•ด์ง„ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์—์„œ ์ง€์ •๋œ ์ปฌ๋Ÿผ๊ฐ’์˜ ์ดํ•ฉ์„ ๊ฐ€์ ธ์˜ด

 

min(์ปฌ๋Ÿผ๋ช…)

์ •ํ•ด์ง„ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์—์„œ ์ง€์ •๋œ ์ปฌ๋Ÿผ๊ฐ’์˜ ์ตœ์†Œ๊ฐ’์„ ๊ฐ€์ ธ์˜ด

 

max(์ปฌ๋Ÿผ๋ช…)

์ •ํ•ด์ง„ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์—์„œ ์ง€์ •๋œ ์ปฌ๋Ÿผ๊ฐ’์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ฐ€์ ธ์˜ด

 

avg(์ปฌ๋Ÿผ๋ช…)

์ •ํ•ด์ง„ ์ง‘ํ•ฉ ๋ ˆ๋ฒจ์—์„œ ์ง€์ •๋œ ์ปฌ๋Ÿผ๊ฐ’์˜ ํ‰๊ท ๊ฐ’์„ ๊ฐ€์ ธ์˜ด

 

์ง‘๊ณ„ ํ•จ์ˆ˜ ์ ์šฉ ์‹œ ์œ ์˜ ์‚ฌํ•ญ

1. ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” Null ์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. min, max ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์ˆซ์ž๊ฐ’ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด, ๋‚ ์งœ/์‹œ๊ฐ„ํ˜•๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

4-4. ์ง‘๊ณ„ ํ•จ์ˆ˜ (Aggregate Function)์™€ count (distinct) ์‹ค์Šต

์‹ค์Šต ์˜ˆ์ œ

์‹ค์Šต์šฉ ํ…Œ์ด๋ธ” emp_test ์กฐํšŒ

1
select * 
from hr.emp_test 
order by deptno;

 

 

1. comm ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ง‘๊ณ„ ํ•จ์ˆ˜ (aggregate function) ์ ์šฉ

1
2
3
4
select deptno, count(*) as cnt, sum(comm), max(comm), min(comm), avg(comm)
from hr.emp_test
group by deptno
order by deptno;

 

 

์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” Null ์„ ์ง‘๊ณ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํŠนํžˆ ํ‰๊ท (avg)์„ ๊ตฌํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๋ถ€์„œ 30์˜ ๊ฒฝ์šฐ ์ „์ฒด ๊ฑด์ˆ˜์ธ count(*)๋Š” 6์ด์ง€๋งŒ, comm ๊ฐ’์ด Null ์ด ์•„๋‹Œ ๊ฑด์ˆ˜๋Š” 4์ด๋‹ค.

๋”ฐ๋ผ์„œ avg(comm)๋Š” 2200 / 6 = 366.67 ์ด ์•„๋‹Œ 2200 / 4 = 550 ์ด ๋œ๋‹ค.

 

2. max, min ํ•จ์ˆ˜๋Š” ์ˆซ์ž๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฌธ์ž์—ด, ๋‚ ์งœ/์‹œ๊ฐ„ ํƒ€์ž…์—๋„ ์ ์šฉ ๊ฐ€๋Šฅ

1
2
3
4
select deptno, max(job), min(ename), max(hiredate), min(hiredate) --, sum(ename) --, avg(ename)
from hr.emp
group by deptno
order by deptno;

 

์‹ค์ œ ๊ฐ™์€ ๋ถ€์„œ ๋‚ด์—๋„ ๋‹ค์–‘ํ•œ job, ename, hiredate ๊ฐ’์ด ์กด์žฌํ•˜์ง€๋งŒ ๊ทธ ์ค‘์— ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ max, min ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.

max ํ•จ์ˆ˜๋ฅผ ๋ฌธ์ž์—ด์— ์ ์šฉํ•˜๋ฉด ์ฒซ ๊ธ€์ž์˜ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ๋’ค์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ฉฐ, ๋‚ ์งœ์— ์ ์šฉํ•˜๋ฉด ๊ฐ€์žฅ ํฐ ๋‚ ์งœ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

min ํ•จ์ˆ˜๋ฅผ ๋ฌธ์ž์—ด์— ์ ์šฉํ•˜๋ฉด ์ฒซ ๊ธ€์ž์˜ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ฉฐ, ๋‚ ์งœ์— ์ ์šฉํ•˜๋ฉด ๊ฐ€์žฅ ์ž‘์€ ๋‚ ์งœ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

 

3. count(distinct ์ปฌ๋Ÿผ๋ช…)๋Š” ์ง€์ •๋œ ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ๊ณ ์œ ํ•œ ๊ฑด์ˆ˜๋ฅผ ์ถ”์ถœ

1
select deptno, count(*) as cnt, count(distinct job) 
from hr.emp_test 
group by deptno;

 

 

์‹ค์ œ ๊ฐ ๋ถ€์„œ์˜ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๋Š” 3, 4, 6๊ฑด์ด์ง€๋งŒ job ์ปฌ๋Ÿผ์œผ๋กœ ์ค‘๋ณต์„ ์ œ์™ธํ•œ ๊ณ ์œ ํ•œ ๊ฑด์ˆ˜๋ฅผ ์ถ”์ถœํ•˜๋ฉด ๊ฐ๊ฐ 3, 3, 3๊ฑด์ด ๋‚˜์˜จ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋ถ€์„œ 10์—๋Š” job ์ปฌ๋Ÿผ์— ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ณ , ๋ถ€์„œ 20์—๋Š” 1๊ฑด, ๋ถ€์„œ 30์—๋Š” 3๊ฑด์˜ ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

4-5. Group By์ ˆ์— ๊ฐ€๊ณต ์ปฌ๋Ÿผ ๋ฐ case when ์ ์šฉ ์‹ค์Šต

Group By ์ ˆ์—๋Š” ํ…Œ์ด๋ธ”์— ์ •์˜๋œ ์ปฌ๋Ÿผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ€๊ณต ์ปฌ๋Ÿผ๋„ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

์ด๋ฅผ ํ†ตํ•ด ๋” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์Šต ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

 

์‹ค์Šต ์˜ˆ์ œ

1. 1000๋ฏธ๋งŒ, 1000-1999, 2000-2999์™€ ๊ฐ™์ด 1000๋‹จ์œ„ ๋ฒ”์œ„๋‚ด์— sal์ด ์žˆ๋Š” ๋ ˆ๋ฒจ๋กœ group by ํ•˜๊ณ  ํ•ด๋‹น ๊ฑด์ˆ˜๋ฅผ ๊ตฌํ•จ

 

(๋‚˜์˜ ์ƒ๊ฐ)

1
2
3
4
select round(sal, -3) as sal_range, count(*) as cnt
from hr.emp
group by round(sal, -3)
order by round(sal, -3);

 

1000 ๋‹จ์œ„ ๋ฒ”์œ„๋กœ sal์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐฉ์‹์ด ์ƒ๊ฐ์ด ์•ˆ ๋‚˜์„œ ๋Œ€์ถฉ(?) round ํ•จ์ˆ˜๋ฅผ ์ผ๋”๋‹ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ ์ด์ƒํ•˜๊ฒŒ ๋ฌถ์—ฌ๋ฒ„๋ ธ๋‹ค.

 

 

round(sal, -3)์€ sal ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ˆ˜ ์„ธ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•ด๋ฒ„๋ฆฐ๋‹ค.

 

์›๋ž˜ emp ํ…Œ์ด๋ธ”์˜ sal ๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

 

sal ๊ฐ’์ด 800, 950์ธ ๊ฒฝ์šฐ ์ •์ˆ˜ ์„ธ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋ฉด 1000์ด ๋œ๋‹ค.

1250, 1300์ธ ๊ฒฝ์šฐ์—๋„ ์ •์ˆ˜ ์„ธ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋ฉด 1000์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ์ผ๋˜ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด 1000 ๋ฏธ๋งŒ์œผ๋กœ ๋ฌถ์ด๋Š” ๋ฐ์ดํ„ฐ๋Š” ํ•œ ๊ฑด๋„ ๋‚˜์˜ค์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

sal ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ 1000 ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋ ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ floor ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

(์ •๋‹ต)

1
2
3
4
select floor(sal/1000)*1000, count(*
from hr.emp
group by floor(sal/1000)*1000
order by floor(sal/1000)*1000;

 

 

์šฐ์„  sal/1000์„ ํ•  ๊ฒฝ์šฐ, 0์ด์ƒ 1000 ๋ฏธ๋งŒ์˜ ๊ฐ’๋“ค์€ ๋ชจ๋‘ 0.xxx์˜ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

์—ฌ๊ธฐ์— floor() ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์†Œ์ˆ˜์  ์ดํ•˜ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ๋ฒ„๋ฆฌ๋ฉด 0์ด ๋œ๋‹ค.

0์— ๋‹ค์‹œ 1000์„ ๊ณฑํ•ด๋„ ๊ฒฐ๊ตญ 0์ด ๋œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ sal/1000์„ ํ•  ๊ฒฝ์šฐ, 1000 ์ด์ƒ 2000 ๋ฏธ๋งŒ์˜ ๊ฐ’๋“ค์€ ๋ชจ๋‘ 1.xxx์˜ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

์—ฌ๊ธฐ์— floor() ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์†Œ์ˆ˜์  ์ดํ•˜ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ๋ฒ„๋ฆฌ๋ฉด 1์ด ๋˜๋ฉฐ, ์ด ๊ฐ’์— ๋‹ค์‹œ 1000์„ ๊ณฑํ•˜๋ฉด 1000์ด ๋œ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ 0 ์ด์ƒ 1000 ๋ฏธ๋งŒ์˜ ๊ฐ’๋“ค์€ 0์œผ๋กœ, 1000 ์ด์ƒ 2000 ๋ฏธ๋งŒ์˜ ๊ฐ’๋“ค์€ 1000์œผ๋กœ, (์ƒ๋žต), 5000 ์ด์ƒ 6000 ์ดํ•˜์˜ ๊ฐ’๋“ค์€ 5000์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿค” postgreSQL์˜ ๋ฐ˜์˜ฌ๋ฆผ ๊ด€๋ จ ํ•จ์ˆ˜๋“ค

 

round(val [,n]) : ์ผ๋ฐ˜์ ์ธ ๋ฐ˜์˜ฌ๋ฆผ ํ•จ์ˆ˜

(์ฐธ๊ณ ) https://www.postgresqltutorial.com/postgresql-math-functions/postgresql-round/

 

PostgreSQL ROUND() Function By Practical Examples

The PostgreSQL ROUND() function rounds a numeric value to its nearest integer or a number with the number of decimal places. Syntax The following illustrates the syntax of the ROUND() function: ROUND (source [ , n ] )Code language: CSS (css) Arguments The

www.postgresqltutorial.com

 

ceil(numeric_expression) : ์ž…๋ ฅ๊ฐ’์„ ํ•˜๋‚˜๋งŒ ๋ฐ›๋Š”๋‹ค. ์†Œ์ˆ˜์  ์•„๋ž˜ ์ˆซ์ž๋ฅผ ๋ฌด์กฐ๊ฑด ์˜ฌ๋ฆฐ๋‹ค. ์ฒœ์žฅ์œผ๋กœ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

(์ฐธ๊ณ ) https://www.postgresqltutorial.com/postgresql-math-functions/postgresql-ceil/

 

PostgreSQL CEIL Function By Practical Examples

The PostgreSQL CEIL() function returns a number rounded up to the next whole number. Syntax The following illustrates the syntax of the CEIL() function: CEIL(numeric_expression) Arguments The CEIL() function requires one argument: 1) numeric_expression The

www.postgresqltutorial.com

 

floor(numeric_expression) : ์ž…๋ ฅ๊ฐ’์„ ํ•˜๋‚˜๋งŒ ๋ฐ›๋Š”๋‹ค. ์†Œ์ˆ˜์  ์•„๋ž˜ ์ˆซ์ž๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฒ„๋ฆฐ๋‹ค. ๋ฐ”๋‹ฅ์œผ๋กœ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

(์ฐธ๊ณ ) https://www.postgresqltutorial.com/postgresql-math-functions/postgresql-floor/

 

PostgreSQL FLOOR Function By Practical Examples

The PostgreSQL FLOOR() function returns a number rounded down to the next whole number. Syntax The syntax of the FLOOR() function is as follows: FLOOR(numeric_expression) Arguments The FLOOR() function requires one argument: 1) numeric_expression The numer

www.postgresqltutorial.com

 

2. job์ด SALESMAN์ธ ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋งŒ ๋‚˜๋ˆ„์–ด์„œ ํ‰๊ท /์ตœ์†Œ/์ตœ๋Œ€ ๊ธ‰์—ฌ๋ฅผ ๊ตฌํ•˜๊ธฐ

1
2
3
4
select case when job = 'SALESMAN' then 'SALESMAN' else 'OTHERS' end as job, 
    round(avg(sal),2) as avg_sal, min(sal) as min_sal, max(sal) as max_sal
from hr.emp
group by case when job = 'SALESMAN' then 'SALESMAN' else 'OTHERS' end;

 

case when์€ select ์ ˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ where, group by, having ์ ˆ์—๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ if ~ else ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” job์ด 'SALESMAN'์ธ ๊ฒฝ์šฐ๋Š” 'SALESMAN'์œผ๋กœ, ๊ทธ ์™ธ์—๋Š” ๋ชจ๋‘ 'OTHERS'๋กœ ๋‚˜๋ˆ„๋„๋ก ํ•˜์—ฌ ์ด๋ฅผ group by ์ ˆ๊ณผ select ์ ˆ์—์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

(์ฐธ๊ณ ) postgreSQL์˜ case๋ฌธ

https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-case/

 

PostgreSQL CASE

Summary: in this tutorial, you will learn how to use the PostgreSQL CASE conditional expression to form conditional queries. The PostgreSQL CASE expression is the same as IF/ELSE statement in other programming languages. It allows you to add if-else logic

www.postgresqltutorial.com

 

4-6. Group By์™€ ์ง‘๊ณ„ ํ•จ์ˆ˜์˜ case when์„ ์ด์šฉํ•œ ํ”ผ๋ด‡ํŒ… ์ดํ•ด

Group By ์‹œ ํ–‰ ๋ ˆ๋ฒจ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์—ด ๋ ˆ๋ฒจ๋กœ ์ „ํ™˜ํ•  ๋•Œ, ์ง‘๊ณ„ ํ•จ์ˆ˜ (aggregate function)์™€ case when์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

๋ณดํ†ต ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด Pivoting ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 

 

Pivoting ํ•˜๋ฉด์„œ Group By์˜ ๋ ˆ๋ฒจ์€ Year + Month ์—์„œ Year ๋กœ ํ™•์žฅ๋์ง€๋งŒ, select ์ ˆ์—์„œ ๋‹ค์‹œ Month ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์„œ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.

 

4-7. Group By์™€ ์ง‘๊ณ„ ํ•จ์ˆ˜์˜ case when์„ ์ด์šฉํ•œ ํ”ผ๋ด‡ํŒ… ์‹ค์Šต

์‹ค์Šต ์˜ˆ์ œ

1-1. deptno, job ๋ณ„๋กœ group byํ•˜๊ณ  ๊ฑด์ˆ˜ ๊ตฌํ•˜๊ธฐ

1
2
3
4
select deptno, job, count(*) as cnt
from hr.emp
group by deptno, job
order by deptno, job;

 

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

 

1-2. group by Pivoting์‹œ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๊ฑด์ˆ˜ ๊ณ„์‚ฐ ์œ ํ˜•(count case when then 1 else null end)

1
2
3
4
5
6
7
8
9
select deptno, count(*) as cnt
    , count(case when job = 'SALESMAN' then 1 end) as salesman_cnt
    , count(case when job = 'MANAGER' then 1 end) as manager_cnt
    , count(case when job = 'ANALYST' then 1 end) as analyst_cnt
    , count(case when job = 'CLERK' then 1 end) as clerk_cnt
    , count(case when job = 'PRESIDENT' then 1 end) as president_cnt
from hr.emp
group by deptno
order by 1;

 

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

 

๊ฑด์ˆ˜ ๊ณ„์‚ฐ์„ ์œ„ํ•ด count() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜ํ•  ์ ์ด ์žˆ๋‹ค.

๋งŒ์•ฝ count() ํ•จ์ˆ˜ ๋‚ด์˜ case ๋ฌธ์—์„œ else null ๋Œ€์‹  else 0์„ ์“ด๋‹ค๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ?

 

1-3. group by Pivoting์‹œ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๊ฑด์ˆ˜ ๊ณ„์‚ฐ์˜ ์ž˜๋ชป๋œ ์‚ฌ๋ก€(count case when then 1 else 0 end)

1
2
3
4
5
6
7
8
9
select deptno, count(*) as cnt
    , count(case when job = 'SALESMAN' then 1 else 0 end) as sales_cnt
    , count(case when job = 'MANAGER' then 1 else 0 end) as manager_cnt
    , count(case when job = 'ANALYST' then 1 else 0 end) as analyst_cnt
    , count(case when job = 'CLERK' then 1 else 0 end) as clerk_cnt
    , count(case when job = 'PRESIDENT' then 1 else 0 end) as president_cnt
from emp
group by deptno
order by 1;

 

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

 

๋ชจ๋“  ์ปฌ๋Ÿผ์— ์ด ๊ฑด์ˆ˜๊ฐ€ ์ง‘๊ณ„๋๋‹ค.

์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์„๊นŒ?

count() ํ•จ์ˆ˜๋Š” ๊ฑด์ˆ˜๋ฅผ ์…€ ๋•Œ 1์„ 1๊ฑด์œผ๋กœ, 0์„ 0๊ฑด์œผ๋กœ ์„ธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ null ์ด ์•„๋‹Œ ๋ชจ๋“  ๊ฐ’์„ 1๊ฑด์œผ๋กœ ์„ธ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ count case when then 1 else null end ๋ฅผ ์ผ์„ ๋•Œ์™€ count case when then 1 else 0 end ๋ฅผ ์ผ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜จ๋‹ค.

(์ฐธ๊ณ ) case ๋ฌธ์—์„œ else null ์„ ์ƒ๋žตํ•˜๊ณ  case when then 1 end ๋ผ๊ณ  ์“ฐ๋ฉด ์•Œ์•„์„œ else null ๊ตฌ๋ฌธ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

 

์œ„์˜ 1-3 ์˜ˆ์‹œ์™€ ๊ฐ™์ด else 0 ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑด์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด count() ํ•จ์ˆ˜ ๋Œ€์‹  sum() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด sum() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๊ฑด์ˆ˜ ์ง‘๊ณ„ ์˜ˆ์‹œ๋ฅผ ์•Œ์•„๋ณด์ž.

 

1-4. group by Pivoting์‹œ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๊ฑด์ˆ˜ ๊ณ„์‚ฐ์— sum()์„ ์ด์šฉ

1
2
3
4
5
6
7
8
9
select deptno, count(*) as cnt
    , sum(case when job = 'SALESMAN' then 1 else 0 end) as sales_cnt
    , sum(case when job = 'MANAGER' then 1 else 0 end) as manager_cnt
    , sum(case when job = 'ANALYST' then 1 else 0 end) as analyst_cnt
    , sum(case when job = 'CLERK' then 1 else 0 end) as clerk_cnt
    , sum(case when job = 'PRESIDENT' then 1 else 0 end) as president_cnt
from emp
group by deptno
order by 1;

 

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

 

4-8. Group By Rollup๊ณผ Group By Cube์˜ ์ดํ•ด

Rollup ๊ณผ Cube ๋Š” Group By ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด Group By ์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ๋“ค์— ๋Œ€ํ•ด์„œ ์ถ”๊ฐ€์ ์ธ Group By ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

Group By Rollup

Group By ์‹œ Rollup ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด Rollup ์— ์ ์šฉ๋œ ์ปฌ๋Ÿผ์˜ ์ˆœ์„œ๋Œ€๋กœ ๊ณ„์ธต์ ์ธ Group By ๋ฅผ ์ถ”๊ฐ€ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

(์˜ˆ์‹œ)

1
2
3
4
select deptno, job, sum(sal)
from hr.emp
group by rollup(deptno, job)
order by 12;

 

 

Group By Cube

Group By ์‹œ Cube ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด Cube ์— ๋‚˜์—ด๋œ ์ปฌ๋Ÿผ๋“ค์˜ ๊ฐ€๋Šฅํ•œ combination ์œผ๋กœ Group By ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

(์˜ˆ์‹œ)

1
2
3
4
select deptno, job, sum(sal) as sum
from hr.emp
group by cube(deptno, job)
order by 12;

 

 

Group By Rollup๊ณผ Cube ์˜ ์ ์šฉ

Rollup(YEAR, MONTH, DAY)

YEAR, MONTH, DAY
YEAR, MONTH
YEAR
()

 

Group By Rollup ์ ˆ์— ๋‚˜์—ด๋œ ์ปฌ๋Ÿผ์ˆ˜๊ฐ€ N๊ฐœ์ด๋ฉด Group By๋Š” N + 1 ํšŒ ์ˆ˜ํ–‰

 

Cube(YEAR, MONTH, DAY)

YEAR, MONTH, DAY
YEAR, MONTH
YEAR, DAY
YEAR
MONTH, DAY
MONTH
DAY
()

 

Group By Cube ์ ˆ์— ๋‚˜์—ด๋œ ์ปฌ๋Ÿผ์ˆ˜๊ฐ€ N๊ฐœ์ด๋ฉด Group By๋Š” 2^n ํšŒ ์ˆ˜ํ–‰

 

4-9. Group By Rollup ์‹ค์Šต

์‹ค์Šต ์˜ˆ์ œ

1. ๋…„+์›”+์ผ๋ณ„ ๋งค์ถœํ•ฉ ๊ตฌํ•˜๋˜, ์›”๋ณ„ ์†Œ๊ณ„ ๋งค์ถœํ•ฉ, ๋…„๋ณ„ ์†Œ๊ณ„ ๋งค์ถœํ•ฉ, ์ „์ฒด ๋งค์ถœํ•ฉ์„ ํ•จ๊ป˜ ๊ตฌํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
with 
temp_01 as (
select to_char(b.order_date, 'yyyy') as year
    , to_char(b.order_date, 'mm') as month
    , to_char(b.order_date, 'dd') as day
    , sum(a.amount) as sum_amount
from nw.order_items a
    join nw.orders b on a.order_id = b.order_id
group by rollup(to_char(b.order_date, 'yyyy'), to_char(b.order_date, 'mm'), to_char(b.order_date, 'dd'))
)
select case when year is null then '์ด๋งค์ถœ' else year end as year
    , case when year is null then null
        else case when month is null then '๋…„ ์ด๋งค์ถœ' else month end
      end as month
    , case when year is null or month is null then null
        else case when day is null then '์›” ์ด๋งค์ถœ' else day end
      end as day
    , sum_amount
from temp_01
order by year, month, day
;

 

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” Group By๊ฐ€ ์ด 3 + 1 = 4๋ฒˆ ์ˆ˜ํ–‰๋œ๋‹ค.

 

4-10. Group By Cube ์‹ค์Šต

Group By Cube ์— ๊ธฐ์ˆ ๋œ ์ปฌ๋Ÿผ์˜ ๊ฐ€๋Šฅํ•œ ๊ฒฐํ•ฉ์œผ๋กœ Group By๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์—…๋ฌด์ ์œผ๋กœ ํ•„์š”์—†๋Š” ์กฐํ•ฉ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๋งŽ์€ ์กฐํ•ฉ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์—…์—์„œ ์‹ค์ œ 3๊ฐœ ์ด์ƒ ์ปฌ๋Ÿผ์˜ Group By Cube ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค.

 

์‹ค์Šต ์˜ˆ์ œ

1. ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ, ์ƒํ’ˆ๋ณ„, ์ฃผ๋ฌธ์ฒ˜๋ฆฌ์ง์›๋ณ„ ๊ฐ€๋Šฅํ•œ ๊ฒฐํ•ฉ์œผ๋กœ Group by ์ˆ˜ํ–‰

1
2
3
4
5
6
7
8
select c.category_name, p.product_name, e.first_name || e.last_name as employee_name, sum(oi.amount) as sum_amount
from nw.order_items oi
    join nw.orders o on oi.order_id = o.order_id
    join nw.employees e on o.employee_id = e.employee_id 
    join nw.products p on oi.product_id = p.product_id 
    join nw.categories c on p.category_id = c.category_id
group by cube(c.category_name, p.product_name, e.first_name || e.last_name)
order by 1,2,3;

 

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” Group By๊ฐ€ ์ด 2^3 = 8๋ฒˆ ์ˆ˜ํ–‰๋œ๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Claire's Study Note

Hi.Claire

ํ™œ๋™ํ•˜๊ธฐ