【问题标题】:PLSQL:求和不存在?
【发布时间】:2022-01-20 09:20:52
【问题描述】:

我已经到处寻找解决问题的方法并尝试了多种方法。

查询试图做的是对表“qo”和表“qoh”中的值求和,并按“SKU”分组。然后它会从另一个中减去一个给我一个我“短”的值。

我的问题:

如果表“qoh”中没有值,则 SKU 不存在,即使是空值也不存在!我希望表“qo”中的总值保持不变,因为没有什么要扣除的,实际发生的是它完全从表“qo”中删除该行并且什么都不返回。

所以基本上,如果它在 qoh 中不存在,那么即使知道 qo 中有一个值,也不会返回任何内容。

谁能看出我哪里出错了?

谢谢

    SELECT qo.sku_id
, SUM(qo.QTY_ORDERED_II) AS "Total ordered"
, SUM(qoh.total_inventory) AS "Total Inventory"
, ABS(SUM(QTY_ORDERED_II - TOTAL_INVENTORY)) AS "Short"

FROM

    (SELECT SKU_ID, SUM(qty_ordered) AS QTY_ORDERED_II
     FROM order_line
     GROUP BY order_line.sku_id) 
     
     qo
     
 JOIN 
    
    (SELECT sku_id, SUM(qty_on_hand) AS TOTAL_INVENTORY 
     FROM INVENTORY 
     GROUP BY sku_id) 
     
     qoh
                                                                                            
ON qo.sku_id = qoh.sku_id
GROUP BY qo.sku_id
HAVING SUM(QTY_ORDERED_II - TOTAL_INVENTORY) > 0 
ORDER BY SKU_ID;

【问题讨论】:

  • 尝试左连接。
  • @jarlh 不走运。
  • 您还需要 COALESCE,按照您当前的逻辑,因为 x - null 产生 nullx - COALESCE(null, 0) 产生 x

标签: sql oracle group-by


【解决方案1】:

这是 SQL,以防 cmets 不够用。

请注意 HAVING clause 的更改。

SELECT qo.sku_id
     , SUM(qo.QTY_ORDERED_II) AS "Total ordered"
     , SUM(qoh.total_inventory) AS "Total Inventory"
     , ABS(SUM(QTY_ORDERED_II - COALESCE(TOTAL_INVENTORY, 0))) AS "Short"
  FROM
  (SELECT SKU_ID, SUM(qty_ordered) AS QTY_ORDERED_II
     FROM order_line
     GROUP BY order_line.sku_id) 
        qo
     
 LEFT JOIN 
    
    (SELECT sku_id, SUM(qty_on_hand) AS TOTAL_INVENTORY 
     FROM INVENTORY 
     GROUP BY sku_id) 
     
     qoh
                                                                                            
    ON qo.sku_id = qoh.sku_id
 GROUP BY qo.sku_id
HAVING SUM(QTY_ORDERED_II - COALESCE(TOTAL_INVENTORY, 0)) > 0 
 ORDER BY SKU_ID;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 2010-12-28
    • 2013-05-27
    • 2021-08-13
    • 2012-09-23
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多