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

如何合并两个带不同WHERE条件的SELECT查询并按用户NIP分组?

解决方案

通用兼容方案(支持所有主流数据库)

优先推荐使用UNION ALL合并两个查询结果后二次聚合的方案,兼容性最强,MySQL、PostgreSQL、SQL Server等所有数据库都可正常运行:

SELECT 
  user_nip,
  SUM(total_terima) AS total_terima,
  SUM(total_menunggu) AS total_menunggu
FROM (
  -- 合并第一个统计接收量的查询结果
  SELECT 
    user_pemilik_nip AS user_nip,
    FLOOR(COUNT(id) / 2) AS total_terima,
    0 AS total_menunggu
  FROM data_berkas 
  WHERE status = 'terima' 
  GROUP BY user_pemilik_nip

  UNION ALL

  -- 合并第二个统计待办量的查询结果
  SELECT 
    user_penerima_nip AS user_nip,
    0 AS total_terima,
    FLOOR(COUNT(id) / 2) AS total_menunggu
  FROM data_berkas 
  WHERE status = 'menunggu' 
  GROUP BY user_penerima_nip
) AS combined_data
GROUP BY user_nip
ORDER BY user_nip;

全外连接方案(仅支持支持FULL OUTER JOIN的数据库)

如果使用PostgreSQL、Oracle、SQL Server等支持全外连接的数据库,可以用FULL OUTER JOIN关联两个子查询,性能略优于第一种方案:

SELECT 
  COALESCE(t1.user_pemilik_nip, t2.user_penerima_nip) AS user_nip,
  COALESCE(t1.total_terima, 0) AS total_terima,
  COALESCE(t2.total_menunggu, 0) AS total_menunggu
FROM (
  SELECT user_pemilik_nip, FLOOR(COUNT(id) / 2) as total_terima 
  FROM data_berkas 
  WHERE status = 'terima' 
  GROUP BY user_pemilik_nip
) t1
FULL OUTER JOIN (
  SELECT user_penerima_nip, FLOOR(COUNT(id) / 2) as total_menunggu 
  FROM data_berkas 
  WHERE status = 'menunggu' 
  GROUP BY user_penerima_nip
) t2 ON t1.user_pemilik_nip = t2.user_penerima_nip
ORDER BY user_nip;

测试结果

用你提供的测试数据运行后,输出结果如下:

user_niptotal_terimatotal_menunggu
admin10
staff00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:15:04