[SQL๐Ÿ”’] sum(case when ~ than ~ else ~ end) ๊ตฌ๋ฌธ ์‚ฌ์šฉ๋ฒ• / ์กฐ๊ฑด ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ

hyizunยท2024๋…„ 4์›” 25์ผ
0

๐Ÿš€Back-end

๋ชฉ๋ก ๋ณด๊ธฐ
1/5
post-thumbnail

๐Ÿ“Œ๋ฌธ๋ฒ•

sum(case when ์กฐ๊ฑด than ๊ฐ’ else (์ƒ๋žต๊ฐ€๋Šฅ) end)

๐Ÿ“‘์‚ฌ์šฉ ๋ฌธ์ œ / 2024๋…„ 04์›” 25์ผ - ์‹ค๊ธฐ์—ฐ์Šต (์‚ฌ์›๊ด€๋ฆฌ)


ย  ๐Ÿ”จ ๋ฌธ์ œ

๐Ÿ“Ž ์‚ฌ์› ๊ธ‰์—ฌ ์กฐํšŒ

์‚ฌ์›๋ฒˆํ˜ธ์‚ฌ์›๋ช…๋ถ€์„œ์ง์œ„๊ทผ๋ฌด์ง€์‹ค์ ์ž…์‚ฌ์ผ
E001๊น€ํƒœํ˜•์ธ์‚ฌ๋ถ€์žฅ๋Œ€์ „์˜์—…์†ŒC๋“ฑ๊ธ‰3,675,000
E002๋ฐ•์ง€๋ฏผ์ด๋ฌด๊ณผ์žฅ์ฒญ์ฃผ์˜์—…์†ŒC๋“ฑ๊ธ‰3,150,000
E003์ •ํ˜ธ์„์ด๋ฌด๋Œ€๋ฆฌ์ฒญ์ฃผ์˜์—…์†ŒD๋“ฑ๊ธ‰2,500,000
E004๋ฏผ์œค๊ธฐ์˜์—…์‚ฌ์›์ถฉ๋‚จ๋ณธ๋ถ€B๋“ฑ๊ธ‰2,160,000

๐Ÿ“Ž ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ์กฐํšŒ

๋ถ€์„œ์ฝ”๋“œ๋ถ€์„œ๋ช…์ด๊ธ‰์—ฌ
01์ธ์‚ฌ3,675,000์›
02์ด๋ฌด5,650,000์›
03์˜์—…2,160,000์›

๐Ÿ“Ž ์ง€์—ญ๋ณ„ ๊ธ‰์—ฌ ์กฐํšŒ

์ง€์—ญ์ž์—ญ๋ช…์ด๊ธ‰์—ฌ
31๋Œ€์ „์˜์—…์†Œ3,675,000์›
32์ฒญ์ฃผ์˜์—…์†Œ5,650,000์›
40์ถฉ๋‚จ๋ณธ๋ถ€2,160,000์›

๐Ÿ“Ž ๊ธ‰์—ฌ ์‚ฐ์ถœ ์กฐ๊ฑด
ย  ๊ธฐ๋ณธ๊ธ‰ + ์‹ค์ (๋ณด๋„ˆ์Šค)
ย  (์‹ค์  ๋ณด๋„ˆ์Šค : D:๋ณด๋„ˆ์Šค์—†์Œ, C:๊ธฐ๋ณธ๊ธ‰5%, B:8%, A:10%)


ย  ๐Ÿ”จ ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ์ดํ„ฐ

๐Ÿ“Ž ํ…Œ์ด๋ธ”

create table tbl_company_employee (
    e_no char(4) not null,
    e_name varchar2(20) not null,
    e_depart char(2) not null,
    e_level char(2) not null,
    e_work_place char(2),
    performance char(1),
    e_join_date char(8) not null,
    constraint tbl_company_employee_pk primary key (e_no)
);
create table tbl_company_depart (
    depart_code char(2) not null,
    d_name varchar2(20),
    constraint tbl_company_depart_pk primary key (depart_code)
);
create table tbl_company_level (
    level_code char(2) not null,
    l_name varchar2(20),
    salary number,
    constraint tbl_company_level_pk primary key (level_code)
);
create table tbl_company_work (
    work_place char(2) not null,
    w_name varchar2(20),
    constraint tbl_company_work_pk primary key (work_place)
);

๐Ÿ“Ž ๋ฐ์ดํ„ฐ

insert into tbl_company_employee values ('E001','๊น€ํƒœํ˜•','01','20','31','C','20200825');
insert into tbl_company_employee values ('E002','๋ฐ•์ง€๋ฏผ','02','30','32','C','20200825');
insert into tbl_company_employee values ('E003','์ •ํ˜ธ์„','02','40','32','D','20200825');
insert into tbl_company_employee values ('E004','๋ฏผ์œค๊ธฐ','03','50','40','B','20200825');
insert into tbl_company_depart values ('01','์ธ์‚ฌ');
insert into tbl_company_depart values ('02','์ด๋ฌด');
insert into tbl_company_depart values ('03','์˜์—…');
insert into tbl_company_depart values ('04','์ƒ์‚ฐ');
insert into tbl_company_level values ('10','์ด์‚ฌ',4500000);
insert into tbl_company_level values ('20','๋ถ€์žฅ',3500000);
insert into tbl_company_level values ('30','๊ณผ์žฅ',3000000);
insert into tbl_company_level values ('40','๋Œ€๋ฆฌ',2500000);
insert into tbl_company_level values ('50','์‚ฌ์›',2000000);
insert into tbl_company_work values ('31','๋Œ€์ „์˜์—…์†Œ');
insert into tbl_company_work values ('32','์ฒญ์ฃผ์˜์—…์†Œ');
insert into tbl_company_work values ('33','๊ณต์ฃผ์˜์—…์†Œ');
insert into tbl_company_work values ('40','์ถฉ๋‚จ๋ณธ๋ถ€');
insert into tbl_company_work values ('50','๋ณธ์‚ฌ');


๐Ÿ”’ sum(case when ~ than ~ else ~ end) ๊ตฌ๋ฌธ์„ ์ด์šฉํ•œ ํ’€์ด


ย  ๐Ÿ”จ ํ‘ธ๋Š” ๋ฐฉ๋ฒ• ์ƒ๊ฐํ•˜๊ธฐ

1. ์ถœ๋ ฅํ•ด์•ผํ•  ๊ฒƒ

  • ์‚ฌ์› ๊ธ‰์—ฌ ์กฐํšŒ
    e_no, e_name, performance, d_name, l_name, w_name, l.salary+(l.salary*(์‹ค์ ๋“ฑ๊ธ‰ ๋ณด๋„ˆ์Šค)) as e_salary

  • ๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ์กฐํšŒ
    d.depart_code, d.d_name, sum(l.salary+(l.salary*(์‹ค์ ๋“ฑ๊ธ‰ ๋ณด๋„ˆ์Šค))) as dept_salary

  • ์ง€์—ญ๋ณ„ ๊ธ‰์—ฌ ์กฐํšŒ
    w.work_place, w.w_name, sum(l.salary+(l.salary*(์‹ค์ ๋“ฑ๊ธ‰ ๋ณด๋„ˆ์Šค))) as work_salary

2. l.salary+(l.salary*(์‹ค์ ๋“ฑ๊ธ‰ ๋ณด๋„ˆ์Šค))๋ฅผ case when ~ ์ด์šฉํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๊ฐ’ ๊ตฌํ•˜๊ธฐ

(case when e.performance = 'D' then l.salary -- ๋ณด๋„ˆ์Šค ์—†์Œ
    when e.performance = 'C' then l.salary+(l.salary*0.05) -- 0.5%
	when e.performance = 'B' then l.salary+(l.salary*0.08) -- 0.8%
	when e.performance = 'A' then l.salary+(l.salary*0.1) -- 1%
end) as ์ปฌ๋Ÿผ๋ช…

3. ์œ„์—์„œ ๋งŒ๋“  ์ปฌ๋Ÿผ select๊ตฌ์ ˆ์— ๋„ฃ๊ธฐ

4. Join ๋ฌธ์žฅ ์™„์„ฑ


ย  ๐Ÿ”จ ์ •๋‹ต

๐Ÿ“Ž ์‚ฌ์› ๊ธ‰์—ฌ ์กฐํšŒ

select e.e_no,
        e.e_name,
        d.d_name,
        l.l_name,
        w.w_name,
        e.performance,
        sum(case when e.performance = 'D' then l.salary 
                when e.performance = 'C' then l.salary+(l.salary*0.05) 
				when e.performance = 'B' then l.salary+(l.salary*0.08)
				when e.performance = 'A' then l.salary+(l.salary*0.1)
			end ) as e_salary
from tbl_company_employee e,
        tbl_company_depart d,
        tbl_company_level l,
        tbl_company_work w
where e.e_depart = d.depart_code and
        e.e_level = l.level_code and
        e.e_work_place = w.work_place
group by e.e_no,e.e_name,d.d_name,l.l_name,w.w_name,e.performance
order by e.e_no;

๋ถ€์„œ๋ณ„ ๊ธ‰์—ฌ ์กฐํšŒ

select d.depart_code,
        d.d_name,
        sum(case when e.performance = 'D' then l.salary
            	when e.performance = 'C' then l.salary+(l.salary*0.05)
            	when e.performance = 'B' then l.salary+(l.salary*0.08)
            	when e.performance = 'A' then l.salary+(l.salary*0.1)
            end) as dept_salary
from tbl_company_employee e,
        tbl_company_depart d,
        tbl_company_level l
where e.e_depart = d.depart_code and
        e.e_level = l.level_code
group by d.depart_code, d.d_name
order by d.depart_code;

์ง€์—ญ๋ณ„ ๊ธ‰์—ฌ ์กฐํšŒ

select w.work_place,
        w.w_name,
        sum(case when e.performance = 'D' then l.salary
            	when e.performance = 'C' then l.salary+(l.salary*0.05)
            	when e.performance = 'B' then l.salary+(l.salary*0.08)
            	when e.performance = 'A' then l.salary+(l.salary*0.1)
            end) as work_salary
from tbl_company_employee e,
        tbl_company_work w,
        tbl_company_level l
where e.e_work_place = w.work_place and
        e.e_level = l.level_code
group by w.work_place, w.w_name
order by w.work_place;
profile
๊ฐœ๋ฐœํ•˜๋Š” ๋””์ž์ด๋„ˆ..?? ๋””์ž์ธํ•˜๋Š” ๊ฐœ๋ฐœ์ž???

0๊ฐœ์˜ ๋Œ“๊ธ€