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

如何合并两个仅细微差异的同表统计SQL查询?已尝试WITH/UNION未果

合并两个相似SQL查询的高效方案

嘿,我来帮你搞定这个SQL合并的问题!你的两个查询核心差异就在于driver表中callsign的匹配规则,一个是not like '0%'(对应"Not Rental"),另一个是like '0%'(对应"Rental"),其余过滤条件完全一致。完全不用分开写两次查询,下面给你几种更高效的合并方式:

方案1:用CASE分组统计(推荐,性能最优)

这种方式只需要扫描一次h_driver_balance表,通过JOIN关联driver表后,用CASE语句直接区分两类数据并分组求和,代码更简洁,性能更好:

SELECT
  CASE
    WHEN d.callsign LIKE '0%' THEN 'Rental'
    ELSE 'Not Rental'
  END AS category,
  SUM(h.balance_delta) AS total_balance_delta
FROM h_driver_balance h
JOIN driver d ON h.driver_balance_id = d.id
WHERE h.changed BETWEEN CURRENT_DATE - INTERVAL '1 days' AND CURRENT_DATE
  AND d.driver_ds_account_id = 16
  AND h.comment LIKE 'Refill on the terminal 1%'
GROUP BY category;

方案2:输出为同一行的两列(和原查询格式更匹配)

如果你希望结果和原来两个查询一样,是两列分别展示"Not Rental"和"Rental"的总和,可以用嵌套CASE的SUM函数实现:

SELECT
  SUM(CASE WHEN d.callsign NOT LIKE '0%' THEN h.balance_delta ELSE 0 END) AS "Not Rental",
  SUM(CASE WHEN d.callsign LIKE '0%' THEN h.balance_delta ELSE 0 END) AS "Rental"
FROM h_driver_balance h
JOIN driver d ON h.driver_balance_id = d.id
WHERE h.changed BETWEEN CURRENT_DATE - INTERVAL '1 days' AND CURRENT_DATE
  AND d.driver_ds_account_id = 16
  AND h.comment LIKE 'Refill on the terminal 1%';

方案3:用WITH + UNION ALL实现(解决你之前的尝试问题)

如果你坚持想用WITH和UNION的方式,需要注意两个查询的列结构要一致,并且加上分类标识来区分结果。这里用WITH提取公共的driver过滤逻辑,避免重复代码:

WITH filtered_drivers AS (
  SELECT id, callsign
  FROM driver
  WHERE driver_ds_account_id = 16
)
SELECT 'Not Rental' AS category, SUM(balance_delta) AS total
FROM h_driver_balance
WHERE changed BETWEEN CURRENT_DATE - INTERVAL '1 days' AND CURRENT_DATE
  AND driver_balance_id IN (SELECT id FROM filtered_drivers WHERE callsign NOT LIKE '0%')
  AND comment LIKE 'Refill on the terminal 1%'
UNION ALL
SELECT 'Rental' AS category, SUM(balance_delta) AS total
FROM h_driver_balance
WHERE changed BETWEEN CURRENT_DATE - INTERVAL '1 days' AND CURRENT_DATE
  AND driver_balance_id IN (SELECT id FROM filtered_drivers WHERE callsign LIKE '0%')
  AND comment LIKE 'Refill on the terminal 1%';

你之前用WITH和UNION可能没注意到要统一列结构,或者没加分类标识,导致结果不符合预期。另外推荐用UNION ALL而不是UNION,因为这两个查询的结果不会有重复,UNION ALL不需要去重,性能更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:16:14