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
关键调整说明
- 用
ISNULL()处理聚合结果:当左连接没有匹配到关联表的数据时,SUM、COUNT这类聚合函数会返回NULL,用ISNULL(聚合结果, 0)就能把这些空值转换成你需要的0,完美匹配你的期望输出。 - 移除多余的
DISTINCT:GROUP BY已经会对cycle_code进行分组去重,再加DISTINCT完全没必要,反而可能影响性能,直接删掉就好。 - 确保主表优先级:你的查询已经用了左连接,主表是
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
相关产品推荐
相关产品推荐

