DAY-24. Oracle group by, having

2 minute read

๐Ÿ” 2022-04-04 - 1

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

โ— ์ˆ˜์—…์„ ๋“ฃ๊ณ , ๊ฐœ์ธ์ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ ์€ ๊ฒƒ ์ด๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋„ ์žˆ์Œ

1๏ธโƒฃ group by

  • ๊ทธ๋ฃนํ•จ์ˆ˜ ๋‹จ ํ•œ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋„์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ(๊ทธ๋ฃน๋ณ„ ์ง‘๊ณ„)
  • ๊ทธ๋ฃนํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋  ๊ทธ๋ฃน ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ group by ์ ˆ์— ํ•ด๋‹น ๊ทธ๋ฃน์„(์ปฌ๋Ÿผ) ๊ธฐ์ˆ ํ•ด ์‚ฌ์šฉ
  • ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ฒฐ๊ณผ ๋„์ถœํ•œ๋‹ค๊ณ  ์ƒ๊ฐ

๐Ÿ”Ž
//๋ถ€์„œ๋ณ„ ์ธ์› ์กฐํšŒ
select nvl(dept_code,'์ธํ„ด') "๋ถ€์„œ์ฝ”๋“œ" , count(*) from employee
    group by dept_code;

๐Ÿ”Ž
// ๋ถ€์„œ๋ณ„ ์ธ์› ์กฐํšŒ -> ๋ถ€์„œ์ฝ”๋“œ๊ฐ€ null ์ธ ๊ฒฝ์šฐ์—๋Š” count๋ฅผ ํ•˜์ง€ ์•Š์Œ
select dept_code "๋ถ€์„œ์ฝ”๋“œ", count(*) from employee
    where dept_code is not null
    group by dept_code;

๐Ÿ”Ž
//๋ถ€์„œ์ฝ”๋“œ, ๋ถ€์„œ๋ณ„ ์ธ์›, ๋ถ€์„œ๋ณ„ ์›”๊ธ‰ ์ดํ•ฉ, ๋ถ€์„œ๋ณ„ ์›”๊ธ‰ ํ‰๊ท  ์กฐํšŒ
select nvl(dept_code,'์ธํ„ด') "๋ถ€์„œ์ฝ”๋“œ" ,
       count(*) "๋ถ€์„œ๋ณ„ ์ธ์›",
       to_char(sum(salary),'L999,999,999') "๋ถ€์„œ๋ณ„ ์›”๊ธ‰ ์ดํ•ฉ",
       to_char(round(avg(salary)),'L999,999,999') "๋ถ€์„œ๋ณ„ ์›”๊ธ‰ ํ‰๊ท "
from employee
       group by dept_code
       order by 1;

๐Ÿ”Ž
//๋ถ€์„œ์ฝ”๋“œ, ๋ณด๋„ˆ์Šค๋ฅผ ์ง€๊ธ‰๋ฐ›๋Š” ์‚ฌ์›์˜ ์ˆ˜(๋ณด๋‹ˆ์Šค์œจ์ด ์žˆ๋Š” ์‚ฌ์›)๋ฅผ ์กฐํšŒ -> ๋ถ€์„œ์ฝ”๋“œ ์ˆœ์œผ๋กœ ์ •๋ ฌ

select nvl(dept_code,'์ธํ„ด')"๋ถ€์„œ์ฝ”๋“œ",
       count(*) || '๋ช…' "๋ณด๋„ˆ์Šค ๋ฐ›๋Š” ์‚ฌ์›์ˆ˜"
from employee
    where bonus is not null
    group by dept_code
    order by 1;

๐Ÿ”Ž
// ์„ฑ๋ณ„, ์„ฑ๋ณ„๋ณ„ ๊ธ‰์—ฌ์˜ ํ‰๊ท (์ •์ˆ˜์ฒ˜๋ฆฌ_์†Œ์ˆ˜์  ๋ฒ„๋ฆผ), ์„ฑ๋ณ„๋ณ„ ๊ธ‰์—ฌ์˜ ํ•ฉ๊ณ„, ์„ฑ๋ณ„๋ณ„ ์ธ์›์ˆ˜ -> ์ธ์›์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ
select
       decode(substr(emp_no, 8, 1),'1','๋‚จ','์—ฌ') "์„ฑ๋ณ„",
       to_char(floor(avg(salary)),'L999,999,999')"๊ธ‰์—ฌ ํ‰๊ท ",
       to_char(sum(salary),'L999,999,999') "๊ธ‰์—ฌ ํ•ฉ๊ณ„ ",
       count(*) "์ธ์›"
from employee
    group by substr(emp_no, 8, 1)
    order by 4 desc;
  • group by์— extract๋ฅผ ์•ˆ์“ฐ๊ณ  hire_date๋กœ ํ•˜๋ฉด ๋…„๋„๋Š” ๊ฐ™์€๋ฐ ๋‚ ์งœ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ๊ทธ๋ฃน์œผ๋กœ ๋ฐ”๋€Œ์–ด๋ฒ„๋ฆฐ๋‹ค ๊ทธ๋ž˜์„œ extract์‚ฌ์šฉ ํ•„์ˆ˜

group by ์•ˆ์— 1๊ฐœ ์ด์ƒ์˜ ์กฐ๊ฑด

  • ๊ทธ๋ฃน ์•ˆ์˜ ๊ทธ๋ฃน โ‡’ ๊ทธ๋ฃน์„ ๋จผ์ € ํ•˜๋‚˜์˜ ์กฐ๊ฑด์œผ๋กœ ๋‚˜๋ˆˆ๋’ค, ๊ทธ ์•ˆ์—์„œ ๋˜ ๋‹ค๋ฅธ ์กฐ๊ฑด์œผ๋กœ ๋‚˜๋ˆ”
๐Ÿ”Ž
//๊ฐ ๋ถ€์„œ์•ˆ์˜ ์ง๊ธ‰๋ณ„๋กœ ๋ถ€์„œ์ฝ”๋“œ, ์ง๊ธ‰์ฝ”๋“œ, ์ง๊ธ‰๋ณ„ ์‚ฌ์›์ˆ˜, ํ‰๊ท ๊ธ‰์—ฌ

select
    nvl(dept_code,'์ธํ„ด') "๋ถ€์„œ์ฝ”๋“œ",
    job_code "์ง๊ธ‰์ฝ”๋“œ",
    count(*) "์‚ฌ์›์ˆ˜",
    round(avg(salary)) "ํ‰๊ท ๊ธ‰์—ฌ"
from employee
    group by dept_code,job_code
    order by 1,2;
๐Ÿ”Ž
//๋ฌธ์ œ3. ๋ถ€์„œ์ฝ”๋“œ, ์„ฑ๋ณ„, ๋ถ€์„œ๋ณ„ ์„ฑ๋ณ„ ์‚ฌ์›์ˆ˜๋ฅผ ๊ตฌํ•˜์„ธ์š”.
 (๋ถ€์„œ์ฝ”๋“œ, ์„ฑ๋ณ„ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ)

select nvl(dept_code,'์ธํ„ด') "๋ถ€์„œ์ฝ”๋“œ",
       decode(substr(emp_no,8,1),'1','๋‚จ','์—ฌ') "์„ฑ๋ณ„",
       count(*)
from employee
       group by dept_code, substr(emp_no,8,1) -- ๋จผ์ € ๋ถ€์„œ๋กœ ๋‚˜๋ˆ„๊ณ  , ๊ทธ ๋‹ค์Œ ์„ฑ๋ณ„๋กœ ๋‚˜๋ˆ”
       order by dept_code ,2 ;

2๏ธโƒฃ Having

  • where์ ˆ์—์„œ groupํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†์„ ๋•Œ
  • group by๋ฅผ ์ด์šฉํ•ด์„œ ๊ทธ๋ฃนํ•จ์ˆ˜๋กœ ๊ฐ’์„ ๊ตฌํ•ด์˜ฌ ๋•Œ ๊ทธ ๊ฐ’์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ๊ฑธ๊ณ  ์‹ถ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜๋Š” ์ ˆ
  • ์ฆ‰ having์€ group by๋ฅผ ํ†ตํ•ด ๋‚˜์˜จ ๊ฐ’์— ๋‹ค์‹œ ์กฐ๊ฑด์„ ์ค„ ๋•Œ ์‚ฌ์šฉ
๐Ÿ”Ž
// ๊ธ‰์—ฌ ํ‰๊ท ์ด 300๋งŒ์› ์ด์ƒ์ธ ๋ถ€์„œ์— ๋Œ€ํ•œ ๋ถ€์„œ์ฝ”๋“œ, ํ‰๊ท ๊ธ‰์—ฌ ์กฐํšŒ
// ๋ถ€์„œ๋ณ„๋กœ ๊ทธ๋ฃนํ™” -> ๊ฐ ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ํ‰๊ท  -> ๊ทธ ํ‰๊ท ์ด 300๋งŒ์› ์ด์ƒ -> ๋ถ€์„œ์ฝ”๋“œ, ํ‰๊ท ๊ธ‰์—ฌ ์กฐํšŒ
// ๋ถ€์„œ์ฝ”๋“œ๊ฐ€ D6๋ผ๋ฉด ์ œ์™ธ

select nvl(dept_code,'์ธํ„ด') "๋ถ€์„œ์ฝ”๋“œ",
	    floor(avg(salary)) "ํ‰๊ท ๊ธ‰์—ฌ"

from employee
	where dept_code not in ('D6')
		group by dept_code
	having floor(avg(salary)) >= 3000000;
๐Ÿ”Ž
//์ธ์›์ด 3๋ช…์ด ๋ฏธ๋งŒ์ธ ์ง๊ธ‰์ฝ”๋“œ๋Š” ์ธ์›์„ ๋ณด์ถฉ
select nvl(job_code,'์ธํ„ด') "์ง๊ธ‰์ฝ”๋“œ",
    count(*) "์ธ์›"
from employee
    group by job_code
    having count(*) < 3; -- group by์˜ ๊ฒฐ๊ณผ ๊ฐ’์— ์กฐ๊ฑด์„ ๊ฑฐ๋Š”๊ฑฐ๋‹ค

๐Ÿ’ก where VS having

  • where์€ ๊ธฐ๋ณธ์ ์ธ ์กฐ๊ฑด์ ˆ๋กœ์„œ ์šฐ์„ ์ ์œผ๋กœ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์กฐ๊ฑด์— ๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ having์€ group by ๋œ ์ดํ›„ ํŠน์ •ํ•œ ํ•„๋“œ๋กœ ๊ทธ๋ฃนํ™” ๋˜์–ด์ง„ ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์— ์กฐ๊ฑด์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
1) select dept_code, salary, from employee where salary > 4000000 group by dept_code;
2) select dept_code, avg(salary) from employee where salary group by dept_code having avg(salary)> 4000000;

1)์˜ ๊ฒฝ์šฐ๋Š” where ์กฐ๊ฑด์ ˆ์— ๋งž๋Š” ์ •๋ณด๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๋“ค๊ณ ์™€์„œ group by๋กœ ๊ทธ๋ฃนํ™” ํ•œ๋‹ค

2)์˜ ๊ฒฝ์šฐ๋Š” group by๋กœ ๊ทธ๋ฃนํ™” ํ•œ ์ƒํƒœ์—์„œ having ์กฐ๊ฑด์ ˆ์— ๋งž๋Š” ์ •๋ณด๋ฅผ ๋“ค๊ณ  ์˜จ๋‹ค

Categories:

Updated:

Leave a comment