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

SQL查询问题:其余列无数据时仍需显示第一列

解决SQL查询中显示所有Section(其余列无值时显示0)的问题

我明白你的需求了:不管关联的库存表有没有对应数据,都要显示ae_i_inv_e表中所有符合条件的cycle_code(也就是Section),并且把没有数据的数值列统一显示为0。你的当前查询没达到预期,主要是聚合函数对NULL的处理和连接逻辑的小细节问题,我来帮你调整:

调整后的SQL语句

SELECT 
    dbo.ae_i_inv_e.cycle_code AS Section,
    ISNULL(SUM(dbo.ae_i_loc_e.qty), 0) AS Quantity_On_Hand,
    ISNULL(SUM(dbo.ae_i_inv_w.whse_cost), 0) AS Average_Cost,
    ISNULL(SUM(dbo.ae_i_loc_e.qty * dbo.ae_i_inv_w.whse_cost), 0) AS Cost_On_Hand,
    ISNULL(COUNT(dbo.ae_i_inv_e.part), 0) AS Items
FROM 
    dbo.ae_i_inv_e
LEFT OUTER JOIN 
    dbo.ae_i_loc_e 
    ON dbo.ae_i_inv_e.multitenant_id = dbo.ae_i_loc_e.multitenant_id
    AND dbo.ae_i_inv_e.part = dbo.ae_i_loc_e.part
LEFT OUTER JOIN 
    dbo.ae_i_inv_w 
    ON dbo.ae_i_loc_e.multitenant_id = dbo.ae_i_inv_w.multitenant_id
    AND dbo.ae_i_loc_e.part = dbo.ae_i_inv_w.part
    AND dbo.ae_i_inv_e.multitenant_id = dbo.ae_i_inv_w.multitenant_id
    AND dbo.ae_i_inv_e.part = dbo.ae_i_inv_w.part
WHERE 
    dbo.ae_i_inv_e.multitenant_id = '2824' 
    AND dbo.ae_i_inv_e.active = 'N'
GROUP BY 
    dbo.ae_i_inv_e.cycle_code
ORDER BY 
    dbo.ae_i_inv_e.cycle_code

关键调整说明

  1. 用ISNULL()处理聚合结果:当左连接没有匹配到关联表的数据时,SUM、COUNT这类聚合函数会返回NULL,用ISNULL(聚合结果, 0)就能把这些空值转换成你需要的0,完美匹配你的期望输出。
  2. 移除多余的DISTINCT:GROUP BY已经会对cycle_code进行分组去重,再加DISTINCT完全没必要,反而可能影响性能,直接删掉就好。
  3. 确保主表优先级:你的查询已经用了左连接,主表是ae_i_inv_e,只要这个表中存在对应的cycle_code,就会被保留下来,不会因为关联表没数据而被过滤。

特殊情况:如果ae_i_inv_e表中没有包含所有需要的Section(比如A/B/C/D/E)

如果你的ae_i_inv_e里本身就没有某些Section的记录,但你还是要显示这些Section,那你需要一个专门的维度表(比如叫section_list)来存储所有可能的Section值,然后从这个维度表出发做左连接:

-- 假设section_list表包含所有需要的Section值(A/B/C/D/E等)
SELECT 
    sl.section AS Section,
    ISNULL(SUM(dbo.ae_i_loc_e.qty), 0) AS Quantity_On_Hand,
    ISNULL(SUM(dbo.ae_i_inv_w.whse_cost), 0) AS Average_Cost,
    ISNULL(SUM(dbo.ae_i_loc_e.qty * dbo.ae_i_inv_w.whse_cost), 0) AS Cost_On_Hand,
    ISNULL(COUNT(dbo.ae_i_inv_e.part), 0) AS Items
FROM 
    section_list sl
LEFT OUTER JOIN 
    dbo.ae_i_inv_e 
    ON sl.section = dbo.ae_i_inv_e.cycle_code
    AND dbo.ae_i_inv_e.multitenant_id = '2824' 
    AND dbo.ae_i_inv_e.active = 'N'
LEFT OUTER JOIN 
    dbo.ae_i_loc_e 
    ON dbo.ae_i_inv_e.multitenant_id = dbo.ae_i_loc_e.multitenant_id
    AND dbo.ae_i_inv_e.part = dbo.ae_i_loc_e.part
LEFT OUTER JOIN 
    dbo.ae_i_inv_w 
    ON dbo.ae_i_loc_e.multitenant_id = dbo.ae_i_inv_w.multitenant_id
    AND dbo.ae_i_loc_e.part = dbo.ae_i_inv_w.part
GROUP BY 
    sl.section
ORDER BY 
    sl.section

这样哪怕ae_i_inv_e里没有某个Section的记录,也能从维度表中获取到对应的Section,并把所有数值列显示为0。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:27:05