TIL 23.09.13

ν™©μ€ν•˜Β·2023λ…„ 9μ›” 13일
0

TIL

λͺ©λ‘ 보기
80/146

πŸ“ŒToday I Learned

였라클 μˆ˜μ—…

ex32

κ·Όνƒœ 상황을 확인할 수 μžˆλŠ” μ½”λ“œμ˜ μ˜ˆμ‹œλ“€

-- κ·Όνƒœ 쑰회 > 9μ›” κ·Όνƒœ 기둝 μ—΄λžŒ > κ²°μ„ν•œ λ‚ μ§œλ„ 포함 + 곡휴일 포함 > 빠진 λ‚ μ§œ λ©”κΎΈκΈ°
-- 1. ANSI-SQL
-- 2. PL/SQL
-- 3. Java

set serveroutput on;

declare
    vdate date;
    vstate varchar2(30);
    vcnt number;
begin
    vdate := to_date('2023-09-01', 'yyyy-mm-dd');

    for i in 1..30 loop
        dbms_output.put_line(vdate);

        select count(*) into vcnt from tblDate where to_char(regdate, 'yyyy-mm-dd') = to_char(vdate, 'yyyy-mm-dd');

        if vcnt > 0 then
            select state into vstate from tblDate where to_char(regdate, 'yyyy-mm-dd') = to_char(vdate, 'yyyy-mm-dd');
            dbms_output.put_line(vstate);
        end if;

        vdate := vdate + 1;
    end loop;
end;


-- ANSI-SQL
-- κ³„μΈ΅ν˜• 쿼리 μ‚¬μš©

select * from tblComputer;

select 
    lpad(' ', level * 3) || name
from tblComputer
    start with seq = 1
        connect by pseq = prior seq;

-- κ³„μΈ΅ν˜• 쿼리 = forλ¬Έ 효과 > 일련 번호 생성
select * from dual;

-- 곡식같은 쿼리
select level -- level이 5보닀 μž‘μœΌλ©΄ λΆ€λͺ¨μžμ‹μ„ 묢어라
from dual
    connect by level <= 5;


select sysdate + level
from dual
    connect by level <= 5;


-- *** κΈ°μ–΅!! > date μžλ£Œν˜•μœΌλ‘œ μ›ν•˜λŠ” κΈ°κ°„μ˜ 데이터 μƒμ„±ν•˜λŠ” 방법    
create or replace view vwDate
as
select 
    to_date('2023-09-01', 'yyyy-mm-dd') + level - 1 as regdate
from dual
    connect by level <= (to_date('2023-09-30', 'yyyy-mm-dd') - to_date('2023-09-01', 'yyyy-mm-dd') + 1);


select * from vwDate;

-- λ§€κ°œλ³€μˆ˜ -> λ·°λŠ” νƒˆλ½μž„

select * from vwDate; -- 9μ›” ν•œλ‹¬ λ‚ μ§œ
select * from tblDate; -- 9μ›” κ·Όνƒœ 기둝

-- 빠진 λ‚ μ§œ μžˆμ–΄μ„œ μ•ˆλ¨
select 
    * 
from vwDate v
    inner join tblDate t
        on v.regdate = t.regdate;

select 
    * 
from vwDate v
    left outer join tblDate t
        on v.regdate = t.regdate
            order by v.regdate;


-- 휴일 처리(ν† , 일)
select 
    v.regdate,
    case
        when to_char(v.regdate, 'd') in ('1') then 'μΌμš”μΌ'
        when to_char(v.regdate, 'd') in ('7') then 'ν† μš”μΌ'
        else t.state
    end as state
from vwDate v
    left outer join tblDate t
        on v.regdate = t.regdate
            order by v.regdate;

-- 곡휴일 처리 (μΆ”κ°€ ν…Œμ΄λΈ” ν•„μš”)
create table tblHoliday(
    seq number primary key,
    regdate date not null,
    name varchar2(30) not null
);

insert into tblHoliday values(1, '2023-09-28', '좔석');
insert into tblHoliday values(2, '2023-09-29', '좔석');

select * from tblHoliday;


-- 평일 + 휴일 처리(ν† , 일) + 곡휴일 + 결석
select 
    v.regdate,
    case
        when to_char(v.regdate, 'd') in ('1') then 'μΌμš”μΌ'
        when to_char(v.regdate, 'd') in ('7') then 'ν† μš”μΌ'
        when t.state is null and h.name is not null then h.name
        when t.state is null and h.name is null then '결석'
        else t.state
    end as state
from vwDate v
    left outer join tblDate t
        on v.regdate = t.regdate
                left outer join tblHoliday h
                    on v.regdate = h.regdate
                        order by v.regdate;

DB ν”„λ‘œμ νŠΈ

각자 뢀뢄을 λ‚˜λˆ„μ–΄ DDL을 μž‘μ„±ν•˜μ˜€κ³  이λ₯Ό κ²€ν† ν•˜μ—¬ λ¬Έμ„œλ‘œ μž‘μ„±ν•˜μ˜€λ‹€. μ‹œν€€μŠ€ 생성 ꡬ문이 λΉ μ Έμžˆμ–΄μ„œ ν•¨κ»˜ μΆ”κ°€ν•˜μ—¬ μž‘μ„±ν•˜μ˜€λ‹€.

κ°œλ… erdλ₯Ό ν”Όν„° μ²Έ ν‘œκΈ°λ²•μœΌλ‘œ μž‘μ„±ν•˜λ‹€κ°€ ν…Œμ΄λΈ” μ‚¬μ΄μ˜ 관계가 λ³΅μž‘ν•΄μ Έ IE ν‘œκΈ°λ²•μœΌλ‘œ λ³€κ²½ν•˜μ—¬ λ‹€μ‹œ μž‘μ„±ν•˜μ˜€λ‹€.

DDLκ³Ό 더미데이터λ₯Ό μ΄μš©ν•΄ λ¨Όμ € μ™„μ„±λœ DML ꡬ문듀을 λ¬Έμ„œν™”ν•˜μ˜€λ‹€.

profile
μ°¨κ·Όμ°¨κ·Ό ν•˜λ‚˜μ”©

0개의 λŒ“κΈ€