년도별, 월별, 일별, 시간별 에 따른 메뉴별 통계 구하는데 데이터가없는곳에는 0값을 넣도록 처리하고싶습니다.. 0 1 1,176

by 똥광 [MySQL] 통계 mysql [2021.05.24 18:32:38]


메뉴1.PNG (15,317Bytes)
메뉴2.PNG (13,197Bytes)
메뉴3.PNG (12,045Bytes)

사진 올리는법을모르겠네요...

 

select * from menu;

m_no - 메뉴번호

m_name - 메뉴명

m_addr - 메뉴주소

m_order - 메뉴순서

~ 등

-- 위 쿼리는 메뉴정보에 대한 테이블 쿼리조회입니다.

------------------------------------------------------------------

select * from menustat; 

위쿼리는 메뉴별 접속횟수 통계를 위한 메뉴접속정보 쿼리입니다.

m_no 메뉴번호, ms_id 는 메뉴를 클릭한 회원id, ms_date는 메뉴클릭한 date 컬럼이있습니다.

--------------------------------------------------------

SELECT a.*, @rownum:=@rownum+1 as num

FROM(select ms.ms_no, ms.m_no, m.m_name, DATE_FORMAT(ms.ms_date, '%Y') as date, count(ms.m_no) as count

from menustat ms, menu m

where ms.m_no = m.m_no

group by DATE_FORMAT(ms.ms_date, '%Y'), ms.m_no

having date between '2020' and '2021'

order by date desc, count desc) a, (SELECT @rownum:=0) b

 

위쿼리에서 해당 년도에 해당하는 메뉴별 접속통계에 대한 정보를 조회했습니다.

 

여기서 2020년을보면 접속하지않은 메뉴에 대한 통계횟수는 나오지않는데

 

기록이없으면 0으로 처리하고싶습니다.

 

검색해보니 left,right outer조인 쓰라고해서 해봤는데 결과가 그대로더라구요..

 

해당년도의 월마다 메뉴별통계 ~ 시간별까지 만들어야하는데 

 

어떻게하는지 도통모르겠습니다 ㅠㅠ.. 조언좀부탁드립니다

 

혹시나 해서 위 쿼리들 결과에 대한 첨부파일도 같이올립니다.

by 마농 [2021.05.27 09:24:40]

1. date, count 등의 예약어를 명칭으로 사용하는 것은 좋지 않습니다.
2. 연도로 가공하여 having 절에서 걸르지 말고 일자 그대로 미리 조건을 주세요.
3. 없는 자료도 나오게 하려면 아우터 조인을 이용하세요.
4. MySQL 8.0 이상이라면? @rownum 대신 ROW_NUMBER() 분석함수를 이용해 보세요.
 

SELECT ms.ms_no
     , m.m_no
     , m.m_name
     , DATE_FORMAT(ms.ms_date, '%Y') yyyy
     , COUNT(ms.m_no) cnt
  FROM menu m
  LEFT OUTER JOIN menustat ms
    ON ms.m_no = m.m_no
   AND ms.ms_date >= CONCAT('2020', '0101') + INTERVAL 0 DAY
   AND ms.ms_date <  CONCAT('2021', '1231') + INTERVAL 1 DAY
 GROUP BY DATE_FORMAT(ms.ms_date, '%Y'), m.m_no
;

 

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