首页 文章

减去两个SUM GROUP BY字段

提问于
浏览
1

我有两个表 itemOrdersitemUsage .

itemOrders 有两个字段: item_numberqty_ordered itemUsage 有两个字段: item_numberqty_used

我正试图说出我的SQL查询,以便它总结两个表中每个项目编号的数量,然后从 itemOrders 减去 itemUsage 中的总计

到目前为止我已经想出了这个:

SELECT itemOrders.item_number
    ,(
        SELECT sum(qty_ordered)
        FROM itemOrders
        GROUP BY itemOrders.item_number
        ) - (
        SELECT sum(qty_used)
        FROM itemUsage
        GROUP BY itemUsage.item_number
        ) AS item_total
FROM itemOrders
INNER JOIN itemUsage 
        ON itemOrders.item_number = itemUsage.item_number
GROUP BY itemOrders.item_number

这里发生的是所有字段都是0 .

示例如果项目编号"A"在 itemOrders 表中的所有"A"实例中显示的总数量为3,并且 itemUsage 表格中所有"A"实例的总数量均为1 . sql应该在item_number字段中的"A"的1个实例旁边的item_total字段中显示第一个 .

2 回答

  • 1

    问题是你正在创建一个 CARTESIAN PRODUCT 并重复 SUM 上的值,只需计算每个分开的值,然后再计算 LEFT JOIN . 如果没有使用任何项目 COALESCENULL 转换为 0

    SELECT io_total.item_number,  
           order_total - COALESCE(used_total, 0) as item_total
    FROM (SELECT io.item_number,  sum(io.qty_ordered) as order_total
          FROM itemOrders io
          GROUP BY io.item_number
         ) io_total
    LEFT JOIN (SELECT iu.item_number, sum(iu.qty_used) as used_total 
               FROM itemUsage iu
               GROUP BY iu.item_number
              ) as iutotal
            ON io_total.item_number = iutotal.item_number
    
  • 0

    好吧,看起来你正在制作三个查询,两个单独的查询,一个用于每个总和,另一个具有未使用的内部联接 . 尝试

    Select itemOrders.item_number, sum(itemOrders.qty_ordered - itemUsage.qty_used) as item_total 
    from itemOrders INNER JOIN itemUsage
    On itemOrders.item_number = itemUsage.item_number
    GROUP BY itemOrders.item_number
    

相关问题