[SQL๐Ÿ”’] case when ~ than ~ end / ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’๋งŒ ํ™œ์šฉํ•˜๊ธฐ

hyizunยท2024๋…„ 5์›” 3์ผ
0

๐Ÿš€Back-end

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

๐Ÿ“Œ๋ฌธ๋ฒ•

case when ์กฐ๊ฑด than ๊ฐ’ end

๐Ÿ“‘์‚ฌ์šฉ ๋ฌธ์ œ / 2024๋…„ 05์›” 03์ผ - ์‹ค๊ธฐ์—ฐ์Šต (๋ฌผ๋ฅ˜์ฐฝ๊ณ ๊ด€๋ฆฌ)


ย  ๐Ÿ”จ ๋ฌธ์ œ

๐Ÿ“Ž (์ œํ’ˆ๋ณ„)์ถœ๊ณ ๋งค์ถœ์ด์ตํ†ต๊ณ„

์ œํ’ˆ์ฝ”๋“œ์ œํ’ˆ๋ช…์ถœ๊ณ ์ˆ˜๋Ÿ‰์ถœ๊ณ ๋งค์ถœ์ด์ต
B01๊ฒฝ๋Ÿ‰์ ์ƒ‰๋ฐ”ํ€ด30๏ฟฆ18,000
B02์ค‘๋Ÿ‰์ ์ƒ‰๋ฐ”ํ€ด25๏ฟฆ20,000
B03์šฐ๋ ˆํƒ„1.0์ธ์น˜50๏ฟฆ25,000
B04์šฐ๋ ˆํƒ„1.5์ธ์น˜40๏ฟฆ24,000
B05์šฐ๋ ˆํƒ„2.0์ธ์น˜60๏ฟฆ42,000

๐Ÿ“Ž ์ถœ๊ณ ๋งค์ถœ์ด์ต ๊ตฌํ•˜๋Š” ์‹
ย  ์ถœ๊ณ ๋งค์ถœ์ด์ต = ์ œํ’ˆ๋ณ„ ์ถœ๊ณ ์ˆ˜๋Ÿ‰ * (์ œํ’ˆ๋ณ„ ์ถœ๊ณ ๋‹จ๊ฐ€ - ์ œํ’ˆ๋ณ„ ์ž…๊ณ ๋‹จ๊ฐ€)


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

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

<์ œํ’ˆ ์ •๋ณด ํ…Œ์ด๋ธ”>
create table tbl_product_202002 (
    p_code char(3) not null, --์ œํ’ˆ์ฝ”๋“œ
    p_name varchar2(20), --์ œํ’ˆ๋ช…
    p_size number, --์‚ฌ์ด์ฆˆ
    p_incost number, --๋งค์ž…๋‹จ๊ฐ€
    p_outcost number, --์ถœ๊ณ ๋‹จ๊ฐ€
    constraint tbl_product_202002_pk primary key (p_code)
);
<๊ฑฐ๋ž˜์ฒ˜ ์ •๋ณด ํ…Œ์ด๋ธ”>
create table tbl_company_202002 (
    c_code char(3) not null, --๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ
    c_name varchar2(20), --๊ฑฐ๋ž˜์ฒ˜๋ช…
    c_tel1 char(3), --์ „ํ™”1
    c_tel2 char(4), --์ „ํ™”2
    c_tel3 char(5), --์ „ํ™”3
    constraint tbl_company_202002_pk primary key (c_code)
);
<์ž…์ถœ๊ณ  ์ •๋ณด ํ…Œ์ด๋ธ”>
create table tbl_inout_202002 (
    t_no char(8) not null, --์ž…์ถœ๊ณ ๋ฒˆํ˜ธ
    p_code char(3), --์ œํ’ˆ์ฝ”๋“œ
    t_type char(1), --์ž…์ถœ๊ณ ๊ตฌ๋ถ„
    t_cnt number, --์ˆ˜๋Ÿ‰
    t_date date, --๊ฑฐ๋ž˜์ผ์ž
    c_code char(3), --๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ
    constraint tbl_inout_202002_pk primary key (t_no)
);

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

<์ œํ’ˆ ์ •๋ณด ํ…Œ์ด๋ธ”>
insert into tbl_product_202002 values ('B01','๊ฒฝ๋Ÿ‰์ ์ƒ‰๋ฐ”ํ€ด',150,3000,3600);
insert into tbl_product_202002 values ('B02','์ค‘๋Ÿ‰์ ์ƒ‰๋ฐ”ํ€ด',200,4000,4800);
insert into tbl_product_202002 values ('B03','์šฐ๋ ˆํƒ„1.0์ธ์น˜',250,2500,3000);
insert into tbl_product_202002 values ('B04','์šฐ๋ ˆํƒ„1.5์ธ์น˜',300,3000,3600);
insert into tbl_product_202002 values ('B05','์šฐ๋ ˆํƒ„2.0์ธ์น˜',350,3500,4200);
insert into tbl_product_202002 values ('B06','์šฐ๋ ˆํƒ„2.5์ธ์น˜',400,4000,4800);
<๊ฑฐ๋ž˜์ฒ˜ ์ •๋ณด ํ…Œ์ด๋ธ”>
insert into tbl_company_202002 values ('10','์„œ์šธ๊ณต์žฅ','02','1488','1000');
insert into tbl_company_202002 values ('20','์šธ์‚ฐ๊ณต์žฅ','052','1488','2000');
insert into tbl_company_202002 values ('30','๋ถ€์‚ฐ์ƒ์‚ฌ','051','1488','3000');
insert into tbl_company_202002 values ('40','๊ด‘์ฃผ์ƒ์‚ฌ','062','1488','4000');
insert into tbl_company_202002 values ('50','๋Œ€์ „์ƒ์‚ฌ','042','1488','4000');
<์ž…์ถœ๊ณ  ์ •๋ณด ํ…Œ์ด๋ธ”>
insert into tbl_inout_202002 values ('20200001','B01','|',100,'20200101','10');
insert into tbl_inout_202002 values ('20200002','B02','|',100,'20200101','10');
insert into tbl_inout_202002 values ('20200003','B03','|',200,'20200101','20');
insert into tbl_inout_202002 values ('20200004','B04','|',300,'20200101','20');
insert into tbl_inout_202002 values ('20200005','B05','|',400,'20200101','20');
insert into tbl_inout_202002 values ('20200006','B06','|',400,'20200101','20');
insert into tbl_inout_202002 values ('20200007','B01','O',30,'20200102','30');
insert into tbl_inout_202002 values ('20200008','B02','O',25,'20200102','40');
insert into tbl_inout_202002 values ('20200009','B03','O',50,'20200103','40');
insert into tbl_inout_202002 values ('20200010','B04','O',40,'20200104','30');
insert into tbl_inout_202002 values ('20200011','B05','O',60,'20200104','50');


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


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

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

  • ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ
    p.p_code(์ œํ’ˆ์ฝ”๋“œ), p.p_name(์ œํ’ˆ๋ช…)

  • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ผ๋ถ€๋งŒ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ
    t_type(์ž…์ถœ๊ณ ๊ตฌ๋ถ„) = 'O(์ถœ๊ณ )' ์ธ t_cnt(์ˆ˜๋Ÿ‰)

  • ์ถœ๊ณ ๋งค์ถœ์ด์ต
    ์ œํ’ˆ๋ณ„ ์ถœ๊ณ ์ˆ˜๋Ÿ‰ * (์ œํ’ˆ๋ณ„ ์ถœ๊ณ ๋‹จ๊ฐ€ - ์ œํ’ˆ๋ณ„ ์ž…๊ณ ๋‹จ๊ฐ€)

    ์ œํ’ˆ๋ณ„ ์ถœ๊ณ ์ˆ˜๋Ÿ‰ = t_type(์ž…์ถœ๊ณ ๊ตฌ๋ถ„) = 'O(์ถœ๊ณ )' ์ธ t_cnt(์ˆ˜๋Ÿ‰)
    ์ œํ’ˆ๋ณ„ ์ถœ๊ณ  ๋‹จ๊ฐ€ = p_outcost(์ถœ๊ณ ๋‹จ๊ฐ€)
    ์ œํ’ˆ๋ณ„ ์ž…๊ณ  ๋‹จ๊ฐ€ = p_incost(์ž…๊ณ ๋‹จ๊ฐ€)


2. case when ~ than ~end ๋ฅผ ์ด์šฉํ•˜์—ฌ t_type(์ž…์ถœ๊ณ ๊ตฌ๋ถ„)์ด 'O(์ถœ๊ณ )' ์ธ t_cnt(์ˆ˜๋Ÿ‰) ๊ตฌํ•˜๊ธฐ

CASE WHEN i.t_type = 'O' THEN i.t_cnt END AS ์ปฌ๋Ÿผ๋ช…

3. t_type(์ž…์ถœ๊ณ ๊ตฌ๋ถ„)์ด 'O(์ถœ๊ณ )' ์ธ t_cnt(์ˆ˜๋Ÿ‰)์— ๋‹ค๋ฅธ ์กฐ๊ฑด ๊ณฑํ•˜๊ธฐ

sum(p.p_outcost - p.p_incost) * CASE WHEN i.t_type = 'O' THEN i.t_cnt END as ์ปฌ๋Ÿผ๋ช…

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

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


ย  ๐Ÿ”จ ์ •๋‹ต

๐Ÿ“Ž (์ œํ’ˆ๋ณ„)์ถœ๊ณ ๋งค์ถœ์ด์ตํ†ต๊ณ„

SELECT 
    p.p_code, p.p_name,
    CASE WHEN i.t_type = 'O' THEN i.t_cnt END AS t_cnt,
sum(p.p_outcost - p.p_incost)*CASE WHEN i.t_type = 'O' THEN i.t_cnt END as tot
FROM 
    tbl_product_202002 p, tbl_inout_202002 i 
where p.p_code = i.p_code and CASE WHEN i.t_type = 'O' THEN i.t_cnt END is not null
GROUP BY p.p_code, p.p_name, CASE WHEN i.t_type = 'O' THEN i.t_cnt END
order by p.p_code asc;

ย  ๐Ÿ”จ ์ฃผ์˜์‚ฌํ•ญ

CASE WHEN ~ ๋ฌธ์žฅ์ด ์•ž์œผ๋กœ ๊ฐ€๋ฉด ๊ฐ’ ๊ณ„์‚ฐ ์•ˆ๋จ

SELECT 
    p.p_code, p.p_name,
    CASE WHEN i.t_type = 'O' THEN i.t_cnt END AS t_cnt,
sum(p.p_outcost - p.p_incost)*CASE WHEN i.t_type = 'O' THEN i.t_cnt END as tot
FROM 
    tbl_product_202002 p, tbl_inout_202002 i 
where p.p_code = i.p_code and CASE WHEN i.t_type = 'O' THEN i.t_cnt END is not null
GROUP BY p.p_code, p.p_name, CASE WHEN i.t_type = 'O' THEN i.t_cnt END
order by p.p_code asc;

profile
๊ฐœ๋ฐœํ•˜๋Š” ๋””์ž์ด๋„ˆ..?? ๋””์ž์ธํ•˜๋Š” ๊ฐœ๋ฐœ์ž???

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