시작일과 종료일만 있는 업체의 월별 통계 쿼리 질문드립니다. 0 7 522

by 정진섭 [SQL Query] [2021.12.03 11:14:39]


스킴구조는 아래와 같습니다.

place_id start_date end_date
10001 2021-01-01 2021-05-31
10002 2021-03-01 2021-07-31

위 테이블을 기준으로 

place_id 는 업체의 고유 아이디 입니다. 

start_date 와 end_date 는 제휴시작일과 제휴 종료일입니다.

업체의 제휴기간 월별 통계를 구하려고 합니다. 

도무지 감자체가 안와서 이렇게 문의를 드립니다.

월별 row 단위로 되어 있지 않아서 어렵네요.. 로직을 바꿔야 하는건지..

어떤식으로 접근을 해야 하나요?

 

==================

원하는 결과물은 

10001 업체는 1,2,3,4,5 월까지 가입이 되었다고 월별 카운트가 더해져야 하고

10002 업체는 4,5,6,7 월까지 가입이 되었다고 월별 카운트에 더해져야 해서 

결국

1월  ,2월 ,3월 1개

4월 2개

5월 2개

,6월,7월 1개

의 통계가 나와야 합니다.

 

 

by 마농 [2021.12.03 11:27:55]

1. 년도 조건으로 검색하나요? 2021년 검색?
2. 일자 컬럼의 데이터 타입은 뭔가요?
3. DB 종류는 뭔가요?


by 정진섭 [2021.12.03 11:47:05]

우선 답변에 감사드립니다.

1. 년도의 월별로 통계 입니다. 구간은 where 절에서 조건으로 붙일 예정이구요.

2.일자의 데이터 타입은 date 타입입니다.

3. mariaDB 10.1.44 입니다.

 


by 마농 [2021.12.03 12:29:01]

조건 예시 및 조건에 따른 결과 예시 들어 주세요.


by 정진섭 [2021.12.03 13:20:49]
ym count
21-01 1
21-02 1
21-03 1
21-04 2
21-05 2
21-06 1
21-07 1

 

이런 결과물을 상상하고 있습니다.

 

[쿼리는 아래 같은 경우입니다.]

select ym,count(*) as `count` from 제휴테이블

where start_date >= '21-01-01' and end_date <= '21-07-31'

group by ym asc

php 단에서 나머지 처리를 할예정이구요..

 


by 마농 [2021.12.03 13:40:36]
WITH RECURSIVE calendar AS
(
SELECT DATE '2021-01-01' dt
 UNION ALL
SELECT dt + INTERVAL 1 MONTH
  FROM calendar
 WHERE dt + INTERVAL 1 MONTH <= '2021-08-31'
)
, t AS
(
SELECT 10001 place_id, DATE '2021-01-01' start_date, DATE '2021-05-31' end_date
UNION ALL SELECT 10002, DATE '2021-03-01', DATE '2021-07-31'
)
SELECT DATE_FORMAT(a.dt, '%Y-%m') ym
     , COUNT(b.end_date) cnt
  FROM calendar a
  LEFT OUTER JOIN t b
    ON b.start_date <  a.dt + INTERVAL 1 MONTH
   AND b.end_date   >= a.dt
 GROUP BY DATE_FORMAT(a.dt, '%Y-%m')
;

 


by 정진섭 [2021.12.03 13:50:37]

@..@ 와 .. 이렇게 되는군요.. 처음보는 WITH RECURSIVE .. 구글링해서 공부 해야 겠습니다.

calendar 는 http://www.gurubee.net/article/65315 이거 맞죠???

테이블로 생성해놓아야 하는건가요? 


by 마농 [2021.12.03 14:10:08]

해당 링크는 구 버전에서 달력을 만드는 방법을 알려드린거구요.
지금 쿼리의 calendar 는 WITH RECURSIVE 구문으로 만들어 낸 집합입니다.
테이블로 미리 만들어 놓고 사용한다면? 더 편리하겠죠.

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