你循环写,确实很蠢。
其实一条sql就可以解决,用case when 即可。
对于查询总累计用水、当日累计用水、当月累计用水以及昨日累计用水,你可以使用以下 SQL 查询语句,假设你的数据表名为 water_meter_records
:
SELECT
projectcode,
MAX(measure) AS total_water_today,
MAX(CASE WHEN DATE(updatedate) = CURDATE() THEN measure END) AS today_water,
MAX(CASE WHEN DATE(updatedate) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN measure END) AS yesterday_water,
MAX(CASE WHEN DATE_FORMAT(updatedate, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m') THEN measure END) AS this_month_water
FROM water_meter_records
GROUP BY projectcode;
这个 SQL 查询会针对每个项目编号(projectcode
)计算总累计用水(total_water_today
)、当日累计用水(today_water
)、昨日累计用水(yesterday_water
)、当月累计用水(this_month_water
)。
total_water_today
表示项目的总累计用水,因为它是 MAX(measure)
,所以它返回了最新的用水记录。today_water
使用 MAX(CASE ...)
来找到当日累计用水,只包括今天的记录。yesterday_water
同样使用 MAX(CASE ...)
来找到昨日累计用水,只包括昨天的记录。this_month_water
也是使用 MAX(CASE ...)
来找到当月累计用水,只包括本月的记录。
这个查询会返回每个项目的用水统计数据,可以根据项目编号来区分。确保你的数据表中包含了足够的记录来获取准确的统计信息。如果你需要进一步的调优,可以考虑为 updatedate
列添加索引,以提高查询性能。