如何通过PHP和SQL批量统计所有公寓电表指定日期区间用电量?
批量查询所有单元指定日期区间用电量的SQL方案
需求背景
我是公寓管理者,每间公寓配备数字电表,每日下载所有单元电表读数的CSV文件并导入SQL数据库。目前已通过PHP+SQL实现从tenants表获取单元号、查询单个指定单元在指定日期区间的用电量,现在需要一键生成所有单元的指定日期区间用电量汇总表。
当前数据库结构
|UNIT|KWH|DATE | |101 |100|01/01/2022| |102 |80 |01/01/2022| |103 |110|01/01/2022| |104 |108|01/01/2022| |101 |110|01/02/2022| |102 |90 |01/02/2022| |103 |125|01/02/2022| |104 |128|01/01/2022| ...
期望输出汇总表
|UNIT|TOTAL KWH|DATE RANGE |101 |10 |01/01/2022 - 01/30/2022| |102 |10 |01/01/2022 - 01/30/2022| |103 |15 |01/01/2022 - 01/30/2022| |104 |20 |01/01/2022 - 01/30/2022|
当前单个单元查询SQL
SELECT Max(KWH)-Min(KWH) AS TOTALKWH, UNIT AS UNIT FROM testdb WHERE UNIT = 'Unit_220' AND Date >= '11/01/2022' AND Date <= '11/30/2022'
修改后的批量查询SQL
直接去掉单个单元的过滤条件,加上GROUP BY UNIT按单元分组计算,同时拼接日期范围字段:
SELECT UNIT, Max(KWH) - Min(KWH) AS `TOTAL KWH`, CONCAT('01/01/2022', ' - ', '01/30/2022') AS `DATE RANGE` FROM testdb WHERE Date >= '01/01/2022' AND Date <= '01/30/2022' GROUP BY UNIT ORDER BY UNIT;
优化方案说明
- 确保日期字段类型正确:如果
DATE字段是字符串类型,建议改成DATE或DATETIME类型,避免字符串比较的潜在错误(比如不同格式日期无法正确排序/筛选)。 - 关联tenants表避免遗漏单元:如果tenants表包含所有有效单元号,用LEFT JOIN可以确保即使某个单元在指定日期区间没有电表读数(比如空房)也能出现在结果中,用电量显示为0或NULL:
SELECT t.UNIT, IFNULL(Max(d.KWH) - Min(d.KWH), 0) AS `TOTAL KWH`, CONCAT('01/01/2022', ' - ', '01/30/2022') AS `DATE RANGE` FROM tenants t LEFT JOIN testdb d ON t.UNIT = d.UNIT AND d.Date >= '01/01/2022' AND d.Date <= '01/30/2022' GROUP BY t.UNIT ORDER BY t.UNIT;
- 处理单条读数的情况:如果某个单元在指定区间只有一条读数,
Max(KWH)-Min(KWH)会得到0,符合实际用电量为0的情况,无需额外处理。
内容的提问来源于stack exchange,提问作者Lloyd Diggins
相关产品推荐
相关产品推荐

