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
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)
각 행의 날짜에 따른 집계를 수행하기 위해 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);
