쿼리문 질문 드립니다.. 0 1 786

by 블루카이 [SQL Query] MS-SQL [2022.09.02 16:02:55]


안녕하세요!
MS-SQL (2016) 쿼리문 질문좀 드리겠습니다.
초보라 모르는게 많네요 ㅜㅜ
대여상품을 일자별로 통계를 내고 싶습니다.

대여상품 테이블

code name
0001 A
0002 B
0003 C
0004 D
0005 E
0006 F
0007 G

예약테이블 테이블

idx g_code start_date end_date
1 0001 2022-09-01 2022-09-05
2 0003 2022-09-25 2022-09-30
3 0006 2022-09-05 2022-09-08
4 0001 2022-09-10 2022-09-15
5 0002 2022-09-10 2022-09-14
6 0002 2022-09-22 2022-09-26
7 0004 2022-09-01 2022-09-05
8 0004 2022-09-06 2022-09-10
9 0004 2022-09-15 2022-09-20
10 0005 2022-09-16 2022-09-18
11 0005 2022-09-20 2022-09-25

쿼리 결과 (예 : 2022년 9월)

상품명 상품코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
A 0001 예약 예약 예약 예약 예약         예약 예약 예약 예약 예약 예약                              
B 0002                   예약 예약 예약 예약 예약               예약 예약 예약 예약 예약        
C 0003                                                 예약 예약 예약 예약 예약 예약
D 0004 예약 예약 예약 예약 예약 예약 예약 예약 예약 예약         예약 예약 예약 예약 예약 예약                    
E 0005                               예약 예약 예약   예약 예약 예약 예약 예약 예약          
F 0006         예약 예약 예약 예약                                            
G 0007                                                            

이렇게 결과를 가져오고 싶습니다.
어떻게 해야 할지 잘 모르겠네요..
고수님들 도와주세요.

by 신이만든지기 [2022.09.02 17:03:41]
with a as (
select '0001' code, 'A' name from dual union all
select '0002' code, 'B' name from dual union all
select '0003' code, 'C' name from dual union all
select '0004' code, 'D' name from dual union all
select '0005' code, 'E' name from dual union all
select '0006' code, 'F' name from dual union all
select '0007' code, 'G' name from dual),
b as (
select 1 idx, '0001' g_code, '2022-09-01' start_date, '2022-09-05' end_date from dual union all
select 2,	'0003', '2022-09-25',	'2022-09-30' from dual union all
select 3,	'0006',	'2022-09-05',	'2022-09-08' from dual union all
select 4,	'0001',	'2022-09-10',	'2022-09-15' from dual union all
select 5,	'0002',	'2022-09-10',	'2022-09-14' from dual union all
select 6,	'0002',	'2022-09-22',	'2022-09-26' from dual union all
select 7,	'0004',	'2022-09-01',	'2022-09-05' from dual union all
select 8,	'0004',	'2022-09-06',	'2022-09-10' from dual union all
select 9,	'0004',	'2022-09-15',	'2022-09-20' from dual union all
select 10,	'0005',	'2022-09-16',	'2022-09-18' from dual union all
select 11,	'0005',	'2022-09-20',	'2022-09-25' from dual
)
select a.name
     , a.code
     , max(case when '01' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "1"
     , max(case when '02' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "2"
     , max(case when '03' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "3"
     , max(case when '04' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "4"
     , max(case when '05' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "5"
     , max(case when '06' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "6"
     , max(case when '07' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "7"
     , max(case when '08' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "8"
     , max(case when '09' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "9"
     , max(case when '10' BETWEEN substr(start_date, -2) AND substr(end_date, -2) then '예약' end) as "10"
     -- 나머지 생략
  from a, b
 where a.code = b.g_code(+)
 group by a.name, a.code
 order by a.code asc
 ;

오라클로 만든거지만, sql server 에서 사용하는 함수로 약간만 변형하시면 될 것 같습니다.( substr -> right)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입