如何合并两个MySQL查询以统计指定季度的总里程?
合并时段里程统计的正确SQL写法
数据库表结构
| jurisdiction | total_miles | quarter | year |
|---|---|---|---|
| AL | 300 | 3 | 2022 |
| AL | 500 | 3 | 2022 |
| AL | 200 | 4 | 2022 |
| AL | 100 | 1 | 2023 |
| AL | 50 | 2 | 2023 |
原独立查询(可正确统计分段里程)
SELECT sum(total_miles) FROM db_table WHERE quarter >= 3 AND year = '2022' AND jurisdiction = 'AL'; SELECT sum(total_miles) FROM db_table WHERE quarter <= 2 AND year = '2023' AND jurisdiction = 'AL';
错误查询的问题
你之前的合并查询用AND连接两个时段条件:
SELECT sum(total_miles) FROM db_table WHERE (quarter >= 3 AND year = '2022') AND (quarter <= 2 AND year = '2023') AND jurisdiction = 'AL'
这会要求一条数据同时满足2022年Q3/Q4和2023年Q1/Q2,显然不存在这样的数据,因此sum(total_miles)返回NULL。
正确的合并查询写法
方法1:用OR连接两个时段条件组
将两个时段的判断用OR分隔,同时保留jurisdiction = 'AL'的全局过滤:
SELECT sum(total_miles) FROM db_table WHERE jurisdiction = 'AL' AND ( (year = '2022' AND quarter >= 3) OR (year = '2023' AND quarter <= 2) );
方法2:用日期范围简化条件(更简洁)
把季度转换为逻辑日期范围,合并后目标时段是2022年7月1日至2023年6月30日,可通过日期函数实现(不同数据库语法略有差异):
-- MySQL示例 SELECT sum(total_miles) FROM db_table WHERE jurisdiction = 'AL' AND STR_TO_DATE(CONCAT(year, '-', (quarter*3-2), '-01'), '%Y-%m-%d') BETWEEN '2022-07-01' AND '2023-06-30';
方法3:分别统计再求和(保留分段结果)
如果需要同时查看分段统计值和总里程,可通过UNION ALL合并后再求和:
SELECT sum(sub.total) AS total_miles FROM ( SELECT sum(total_miles) AS total FROM db_table WHERE quarter >=3 AND year='2022' AND jurisdiction='AL' UNION ALL SELECT sum(total_miles) AS total FROM db_table WHERE quarter <=2 AND year='2023' AND jurisdiction='AL' ) AS sub;
内容的提问来源于stack exchange,提问作者I_hate_arrays42
相关产品推荐
相关产品推荐

