[MySQL] 최근7일간의 데이터만 집계하기

seonjeong·2023년 5월 11일

MySQL

목록 보기
8/9
post-thumbnail
  1. 쿼리의 SELECT
    accountCnt의 경우 DISTINCT를 사용하여 중복되는 가입 일자를 하나의 가입으로 세지 않도록 하였다
    • weekDate: 최근 7일 간의 날짜
    • reviewCnt: 최근 7일 간의 신발 리뷰 수
    • orderCnt: 최근 7일 간의 주문 수
    • orderTotalprice: 최근 7일 간의 주문 총 금액
    • accountCnt: 최근 7일 간의 신규 회원 가입 수
    • inquiryWaitingCnt: 최근 7일 간의 문의 대기 수
SELECT DATE(NOW() - INTERVAL (6 - t.n) DAY) weekDate, 
	IFNULL(COUNT(srwdate), 0) reviewCnt,
    IFNULL(COUNT(orderDate),0) orderCnt,
    IFNULL(SUM(orderTotalprice), 0) orderTotalprice,
    IFNULL(COUNT(DISTINCT regdate),0) accountCnt,
    IFNULL(COUNT(inqDate),0) inquiryWaitingCnt



  1. 최근7일간의 데이터를 구하기위해 UNION ALL을 이용하여 0~6까지의 숫자를 가진 행을 생성하였다.
    • UNION ALL : 두개 이상의 행을 합친다
(SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6)



  1. 각 행의 날짜에 따른 집계를 수행하기 위해 LEFT JOIN참조하여 4개의 테이블을 연결하였다
    DATE(NOW() - INTERVAL (6 - t.n) DAY)는 현재 날짜부터 일주일간의 데이터를 조회할 수 있는 쿼리문이다

    • DATE_ADD(기준날짜, INTERVAL) : 시간 더하기
    • DATE_SUB(기준날짜, INTERVAL) : 시간 빼기
  LEFT JOIN SHOEREVIEW ON DATE(srwdate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)
	LEFT JOIN (SELECT * FROM PRODUCTORDER WHERE orderState=0 AND deliveryState=0) A ON DATE(A.orderDate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)
	LEFT JOIN MEMBER M ON DATE(M.regdate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)
    LEFT JOIN 
		(SELECT *
		FROM PRODUCTINQUIRY
		WHERE inqRef IN (SELECT inqSeq FROM PRODUCTINQUIRY WHERE inqDepth = 0)) C ON DATE(C.inqDate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)



  • 전체쿼리문
SELECT DATE(NOW() - INTERVAL (6 - t.n) DAY) weekDate, 
	IFNULL(COUNT(srwdate), 0) reviewCnt,
    IFNULL(COUNT(orderDate),0) orderCnt,
    IFNULL(SUM(orderTotalprice), 0) orderTotalprice,
    IFNULL(COUNT(DISTINCT regdate),0) accountCnt,
    IFNULL(COUNT(inqDate),0) inquiryWaitingCnt
FROM 
	(SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) t
	LEFT JOIN SHOEREVIEW ON DATE(srwdate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)
	LEFT JOIN (SELECT * FROM PRODUCTORDER WHERE orderState=0 AND deliveryState=0) A ON DATE(A.orderDate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)
	LEFT JOIN MEMBER M ON DATE(M.regdate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)
    LEFT JOIN 
		(SELECT *
		FROM PRODUCTINQUIRY
		WHERE inqRef IN (SELECT inqSeq FROM PRODUCTINQUIRY WHERE inqDepth = 0)) C ON DATE(C.inqDate) = DATE(NOW() - INTERVAL (6 - t.n) DAY)
GROUP BY DATE(NOW() - INTERVAL (6 - t.n) DAY);
  • 결과물
profile
🦋개발 공부 기록🦋

0개의 댓글