如何按datetime分组并聚合两行数据求和以生成柱状图数据
按日期分组求和的SQL实现方案
针对task_project_field表中日期(dateValue字段)和数值(stringValue字段)分存为不同记录的情况,以下两种方法可以生成柱状图所需的X轴(日期分组)和Y轴(数值求和)数据:
方法1:用CTE+条件聚合配对数据后求和
WITH task_data AS ( SELECT task_id, -- 提取每个任务对应的日期 MAX(CASE WHEN field_name = 'dateValue' THEN date_value END) AS date_value, -- 提取每个任务对应的数值并转换为数值类型 CAST(MAX(CASE WHEN field_name = 'stringValue' THEN string_value END) AS DECIMAL(10,2)) AS num_value FROM task_project_field WHERE field_name IN ('dateValue', 'stringValue') GROUP BY task_id -- 过滤掉缺失日期或数值的无效任务 HAVING date_value IS NOT NULL AND num_value IS NOT NULL ) SELECT date_value AS x_axis_date, SUM(num_value) AS y_axis_sum FROM task_data -- 按日期分组求和 GROUP BY date_value -- 按日期排序,保证柱状图顺序正确 ORDER BY date_value;
逻辑说明
- 先通过CTE
task_data按任务ID分组,把每个任务的日期和数值从两条记录中整合到同一行; - 过滤掉没有日期或有效数值的任务数据;
- 最后按日期分组,对每个日期下的所有任务数值求和,得到柱状图需要的分组数据。
方法2:自连接关联日期与数值记录后求和
SELECT t1.date_value AS x_axis_date, -- 对同一日期下的所有数值求和 SUM(CAST(t2.string_value AS DECIMAL(10,2))) AS y_axis_sum FROM task_project_field t1 -- 自连接匹配同一任务的日期和数值记录 JOIN task_project_field t2 ON t1.task_id = t2.task_id AND t1.field_name = 'dateValue' AND t2.field_name = 'stringValue' -- 按日期分组 GROUP BY t1.date_value ORDER BY t1.date_value;
逻辑说明
直接将表自连接,让存储日期的记录(t1)和存储数值的记录(t2)通过任务ID关联,确保配对的是同一任务的数据,之后按日期分组求和即可。
注意事项
- 如果
stringValue中存在非数值内容,建议用TRY_CAST替代CAST,避免因转换失败导致查询报错; - 若同一任务存在多条日期或数值记录,需根据实际业务需求调整聚合函数(比如用
SUM替代MAX提取数值)。
内容的提问来源于stack exchange,提问作者Ramji
相关产品推荐
相关产品推荐

