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

多表使用UNION ALL时如何去除空行

解决UNION ALL合并多表时的空行问题

我来帮你搞定这个合并后出现空行的问题~从你的SQL代码来看,空行大概率来自两个地方:要么是子查询里混入了MNO为空的无效记录,要么是分组后某些会员在指定日期范围内没有任何余额、采购或扣款记录,导致三个数值字段全为0。咱们可以从这两个角度优化:

优化思路1:从源头过滤无效记录

在每个子查询的WHERE条件里加上非空判断,把没有会员编号的记录直接排除,避免它们进入合并环节。

优化思路2:过滤分组后全0的行

分组完成后,用HAVING条件只保留至少有一个数值字段不为0的行,剔除那些没有任何业务数据的“空行”。

下面是修改后的完整SQL代码:

declare @FromDate date='2018-05-01'; 
declare @ToDate date='2018-05-10'; 

select 
    ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS [SNO],
    t.MNO,
    MNAME ,
    isnull(sum(v1),0.00) as Balance,
    isnull(sum(v2),0.00) as CurrentPurchase,
    isnull(sum(v3),0.00) as Deduction 
from (
    -- 过滤tblProductPurchaseBalance中MNO为空的记录
    select MNO, PendingDeduc as v1, NULL as v2, NULL as v3 
    from tblProductPurchaseBalance 
    where EntryDate between @FromDate and @ToDate 
    AND MNO IS NOT NULL
    union all 
    -- 过滤tblMnoProductPurchase中MNO为空的记录
    select MNO, NULL as v1, TotalAmount, NULL as v3 
    from tblMnoProductPurchase 
    where PurchaseDate between @FromDate and @ToDate 
    AND MNO IS NOT NULL
    union all 
    -- 过滤tblDeduction中MemNo为空的记录
    select MemNo as MNO, NULL as v1, NULL as v2, AAVIN from tblDeduction 
    where EntryDate between @FromDate and @ToDate 
    AND MemNo IS NOT NULL
) t 
inner join TBLMEMBERS on t.MNO=TBLMEMBERS.MNO 
group by t.MNO,MNAME 
-- 只保留至少有一个数值字段不为0的行
having isnull(sum(v1),0.00) <> 0 
   OR isnull(sum(v2),0.00) <> 0 
   OR isnull(sum(v3),0.00) <> 0 
order by t.MNO 

方案说明

  • 子查询过滤:每个子查询都加上了会员编号的非空判断,从源头杜绝无效空记录进入合并结果,减少后续处理的冗余。
  • 分组后过滤:HAVING条件会检查分组后的三个数值字段,只要其中一个不为0就保留该行,完美剔除那些没有任何业务数据的“空行”,和你需要的结果一致。

如果你的空行是其他特殊情况(比如个别字段为NULL),可以根据实际需求调整HAVING里的条件,但这个方案应该能解决你描述的核心问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:17