都还有优化
-- 按天统计
select date useDate ,count moduleNumber from (
SELECT DATE_FORMAT(date,'%Y-%m-%d') AS date,IFNULL(data.num, 0) AS count
FROM (
SELECT @days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
FROM (SELECT @days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
FROM basic_use_list
) day
WHERE DATE_FORMAT(@days, '%Y-%m-%d') >
'2022-01-15'
ORDER BY date
) dates
LEFT JOIN (
SELECT
sum(module_number) AS num,
DATE(use_date) AS time
FROM
basic_use_list
WHERE
1 = 1
AND use_type = 0
AND module_id = 42
GROUP BY
DATE(use_date)
) data ON DATE(time) = date
where DATE(date) <= '2022-12-31'
ORDER BY date) a
;
-- SELECT DATE_SUB(CURDATE(), INTERVAL 90 DAY) from dual
-- 按月统计
SELECT
datee useDate,
sum(count) moduleNumber
FROM
(
SELECT
DATE_FORMAT(date, '%Y-%m') AS datee,
IFNULL(DATA .num, 0) AS count
FROM
(
SELECT
@days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
FROM
(
SELECT
@days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
FROM
basic_use_list
) DAY
WHERE
DATE_FORMAT(@days, '%Y-%m-%d') > '2022-07-01'
ORDER BY
date
) dates
LEFT JOIN (
SELECT
sum(module_number) AS num,
DATE_FORMAT(use_date, '%Y-%m-%d') AS time
FROM
basic_use_list
WHERE
1 = 1
AND use_type = 0
AND module_id = 42
GROUP BY
DATE(time)
) DATA ON DATE(time) = date
where DATE(date) <= '2023-12-31'
ORDER BY
date
) a
GROUP BY datee;
SELECT
module_id AS moduleId,
module_name AS moduleName,
sum(module_number) AS moduleNumber,
use_date AS useDate
FROM
basic_use_list
WHERE
1 = 1
AND use_type = 0
AND module_id = 41
AND use_date >= '2022-01-01'
AND use_date <= '2022-12-31'
group by useDate
ORDER BY
useDate ASC
-- 按周统计
SELECT
datee useDate,
sum(count) moduleNumber
FROM
(
SELECT
DATE_FORMAT(date, '%Y-%m-%d') AS datee,
IFNULL(DATA .num, 0) AS count
FROM
(
SELECT
@days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
FROM
(
SELECT
@days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
FROM
basic_use_list
) DAY
WHERE
DATE_FORMAT(@days, '%Y-%m-%d') > '2022-12-07'
ORDER BY
date
) dates
LEFT JOIN (
SELECT
sum(module_number) AS num,
DATE_FORMAT(use_date, '%Y-%m-%d') AS time
FROM
basic_use_list
WHERE
1 = 1
AND use_type = 0
AND module_id = 19
GROUP BY
DATE(time)
) DATA ON DATE(time) = date
where DATE(date) <= '2023-02-07'
ORDER BY
date
) a
GROUP BY (DATEDIFF(datee, DATE_FORMAT(DATE_SUB('2022-12-07',INTERVAL 1 DAY),'%Y-%m-%d'))-1) DIV 7
;