繁体   English   中英

Sql表左外部联接结果分组依据

[英]Sql Table Left outer join result Group By

产品1

3张发票的购买数量为50 + 100 + 50 = 200和

1张发票的销售数量为10

我正在使用下面的代码来获取结果

Total Purchase - Total Sale = Closing Qty 
     200       -      10    = 290

但是我得到了错误的结果,如下图所示:

在此处输入图片说明

请指导我更正我的代码

SELECT 
    P.PRODUCT as PRODUCTNAME,
    P.QUANTITY AS PURCHASE,
    ISNULL(S.QUANTITY, 0) AS SALE,
    ISNULL(P.QUANTITY, 0) - ISNULL(s.QUANTITY, 0) AS CLOSINGQTY
FROM 
    [PurchaseData] P 
LEFT OUTER JOIN 
    [DeliveryData1] S ON P.Product = s.PRODUCT

如果您想要最终结果,则应使用sum和group by

      SELECT 
        P.PRODUCT as PRODUCTNAME,
        sum(P.QUANTITY AS PURCHASE),
        sum(isnull(S.QUANTITY,0)) AS SALE,
        sum(isnull(P.QUANTITY,0))-sum(isnull(s.QUANTITY,0)) AS CLOSINGQTY

    FROM [PurchaseData] P LEFT OUTER JOIN [DeliveryData1] S ON P.Product = s.PRODUCT
    GROUP BY P.PRODUCT

如果我理解正确,则您有问题,因为给定产品具有多个购买记录。 如果是这种情况,则只需 JOIN 之前进行聚合:

SELECT p.*, COALESCE(S.QUANTITY, 0) AS SALE,
       COALESCE(P.QUANTITY, 0)-COALESCE(s.QUANTITY, 0) AS CLOSINGQTY
FROM (SELECT p.product, p.quantity
      FROM PurchaseData P
      GROUP BY p.product
     ) p LEFT OUTER JOIN 
     DeliveryData1 S
     ON P.product = s.producct;

实际上,我不清楚两个表中的哪个表都有重复项,或者即使两个都重复。 因此,您可能需要对S执行类似的操作。

当使用来自不同表的聚合时,不要先合并表再聚合,而先聚合并加入聚合:

select
  p.product as productname,
  p.sum_quantity as purchase,
  coalesce(s.sum_quantity, 0) as sale,
  p.sum_quantity - coalesce(s.sum_quantity, 0) as closingqty
from
(
  select product, sum(quantity) as sum_quantity
  from purchasedata
  group by product
) p
left join
(
  select product, sum(quantity) as sum_quantity
  from deliverydata1
  group by product  
) s on s.product = p.product;

我已经将ifnull替换为coalesce ,因此查询完全符合标准SQL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM