MS-SQL 2016을 사용하고 있습니다.
계속 쿼리문을 만들어 보고 있는데 정말 어렵네요.
월별 차량 예약정보를 확인후 예약이 가능하도록 하는 쿼리를 만들어 보고 싶은데 잘 안되네요.
고수님들 좀 도와 주시거나, 힌트 같은게 있으면 부탁드리겠습니다.
차량 테이블
| code | name |
| 0001 | 차량1 |
| 0002 | 차량1 |
| 0003 | 차량3 |
| 0004 | 차량4 |
예약 테이블
| order_code | car_code | start_date | end_date |
| ord0001 | 0001 | 2022-10-01 | 2022-10-03 |
| ord0002 | 0001 | 2022-10-15 | 2022-10-18 |
| ord0003 | 0001 | 2022-11-05 | 2022-11-07 |
| ord0004 | 0002 | 2022-10-16 | 2022-10-17 |
| ord0005 | 0002 | 2022-10-03 | 2022-10-03 |
10월 예약현황
| 차량코드 | 차량명 | 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 | 31 |
| 0001 | 차량1 | 완료 | 완료 | 완료 | 완료 | 완료 | 완료 | 완료 | ||||||||||||||||||||||||
| 0002 | 차량2 | 완료 | 완료 | 완료 | ||||||||||||||||||||||||||||
| 0003 | 차량3 | |||||||||||||||||||||||||||||||
| 0004 | 차량4 |
11월 예약현황
| 차량코드 | 차량명 | 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 | 31 |
| 0001 | 차량1 | 완료 | 완료 | 완료 | ||||||||||||||||||||||||||||
| 0002 | 차량2 | |||||||||||||||||||||||||||||||
| 0003 | 차량3 | |||||||||||||||||||||||||||||||
| 0004 | 차량4 |
12월 예약현황
| 차량코드 | 차량명 | 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 | 31 |
| 0001 | 차량1 | |||||||||||||||||||||||||||||||
| 0002 | 차량2 | |||||||||||||||||||||||||||||||
| 0003 | 차량3 | |||||||||||||||||||||||||||||||
| 0004 | 차량4 |
이렇게 월별로 현황판을 구현해 보고 싶습니다.
MS-SQL 사용하고 있습니다. 초보에요;
감사합니다.
WITH car_code AS
(
SELECT '0001' code, '차량1' name
UNION ALL SELECT '0002', '차량2'
UNION ALL SELECT '0003', '차량3'
UNION ALL SELECT '0004', '차량4'
)
, car_order AS
(
SELECT 'ord0001' order_code, '0001' car_code, '2022-10-01' start_date, '2022-10-03' end_date
UNION ALL SELECT 'ord0002', '0001', '2022-10-15', '2022-10-18'
UNION ALL SELECT 'ord0003', '0001', '2022-11-05', '2022-11-07'
UNION ALL SELECT 'ord0004', '0002', '2022-10-16', '2022-10-17'
UNION ALL SELECT 'ord0005', '0002', '2022-10-03', '2022-10-03'
)
, calendar AS
(
SELECT DATEADD(day, 0, '2022-11-01') dt
UNION ALL
SELECT DATEADD(day, 1, dt) dt
FROM calendar
WHERE dt < DATEADD(day, -1, DATEADD(month, 1, '2022-11-01'))
)
SELECT *
FROM (SELECT a.code
, a.name
, d.d
, d.v
FROM car_code a
LEFT OUTER JOIN
(SELECT c.car_code
, DAY(b.dt) d
, '완료' v
FROM calendar b
INNER JOIN car_order c
ON b.dt BETWEEN c.start_date AND c.end_date
) d
ON a.code = d.car_code
) e
PIVOT (MIN(v) FOR d
IN ( [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]
, [31] )) f
;
정말 진심으로 감사드립니다. 많은 것을 배우고 갑니다...