You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

选举系统中如何编写SQL查询实现按日期分组的累计投票统计?

实现按日期分组的投票数及累计总和SQL查询

核心思路

先按日期分组统计当日投票数量,再通过窗口函数(或子查询,针对旧版数据库)计算从起始日期到当前日期的累计投票总和,满足「前一日累计 + 当日票数」的需求。


针对支持窗口函数的数据库(MySQL 8.0+/PostgreSQL/SQL Server)

MySQL 示例

SELECT
    -- 格式化日期为 dd/MM 格式
    DATE_FORMAT(STR_TO_DATE(created_at, '%d/%m/%Y'), '%d/%m') AS vote_date,
    -- 统计当日投票数
    COUNT(voters_id) AS daily_votes,
    -- 按日期排序后累加所有历史票数,得到累计总和
    SUM(COUNT(voters_id)) OVER (ORDER BY STR_TO_DATE(created_at, '%d/%m/%Y')) AS cumulative_votes
FROM voters
-- 按原始日期分组,避免不同年份的同日期数据冲突
GROUP BY STR_TO_DATE(created_at, '%d/%m/%Y'), DATE_FORMAT(STR_TO_DATE(created_at, '%d/%m/%Y'), '%d/%m')
ORDER BY STR_TO_DATE(created_at, '%d/%m/%Y');

PostgreSQL 示例

SELECT
    TO_CHAR(TO_DATE(created_at, 'DD/MM/YYYY'), 'DD/MM') AS vote_date,
    COUNT(voters_id) AS daily_votes,
    SUM(COUNT(voters_id)) OVER (ORDER BY TO_DATE(created_at, 'DD/MM/YYYY')) AS cumulative_votes
FROM voters
GROUP BY TO_DATE(created_at, 'DD/MM/YYYY'), TO_CHAR(TO_DATE(created_at, 'DD/MM/YYYY'), 'DD/MM')
ORDER BY TO_DATE(created_at, 'DD/MM/YYYY');

SQL Server 示例

SELECT
    FORMAT(CONVERT(DATE, created_at, 103), 'dd/MM') AS vote_date,
    COUNT(voters_id) AS daily_votes,
    SUM(COUNT(voters_id)) OVER (ORDER BY CONVERT(DATE, created_at, 103)) AS cumulative_votes
FROM voters
GROUP BY CONVERT(DATE, created_at, 103), FORMAT(CONVERT(DATE, created_at, 103), 'dd/MM')
ORDER BY CONVERT(DATE, created_at, 103);

针对不支持窗口函数的旧版数据库(如 MySQL 5.x)

用子查询实现累计统计:

SELECT
    DATE_FORMAT(STR_TO_DATE(v1.created_at, '%d/%m/%Y'), '%d/%m') AS vote_date,
    COUNT(v1.voters_id) AS daily_votes,
    -- 子查询统计当前日期及之前的所有票数
    (SELECT COUNT(v2.voters_id) 
     FROM voters v2 
     WHERE STR_TO_DATE(v2.created_at, '%d/%m/%Y') <= STR_TO_DATE(v1.created_at, '%d/%m/%Y')) AS cumulative_votes
FROM voters v1
GROUP BY STR_TO_DATE(v1.created_at, '%d/%m/%Y'), DATE_FORMAT(STR_TO_DATE(v1.created_at, '%d/%m/%Y'), '%d/%m')
ORDER BY STR_TO_DATE(v1.created_at, '%d/%m/%Y');

输出结果

以上查询会返回符合需求的数据:

vote_datedaily_votescumulative_votes
20/0711
21/0723
22/0725

其中cumulative_votes就是「前一日累计 + 当日票数」的总和,可直接用于ChartJS的图表渲染。

内容的提问来源于stack exchange,提问作者user19593694

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:15:47