尝试计算多个货物的现有数量和手头价值

时间:2013-04-04 16:37:33

标签: sql sql-server

我有这个查询,我有一个Acquisitions表(Incoming)和Invoice Table(Outgoing)我试图通过获取AVG dbo.tblAcqDetail.AcqPrice *来计算手头的价值,这个QtyOnHand被认为是接收传入 - 传出。当我在Acquisitions表上添加对同一项目具有不同成本的行项目时,AVG不会进行分组,而是在下面显示两个行项目示例。出货方可以使用多个订单项正常工作......

Product  QtyIn  QtyOut   On_Hand   AVGPrice   Value_OnHand 
Screws     100      30        70    25.0000      1750.0000 
Nuts        50      10        40    40.0000      1600.0000 
Nuts       100      10        90    50.0000      4500.0000 
Bolts      100      20        80    100.000      8000.0000

SELECT DISTINCT
        dbo.tblProduct.Product ,
        SUM(DISTINCT dbo.tblAcqDetail.AcqQuantity) AS QtyIN ,
        SUM(DISTINCT dbo.tblInvoiceDetail.InvQuantity) AS QtyOut ,
        SUM(DISTINCT dbo.tblAcqDetail.AcqQuantity)
        - SUM(DISTINCT dbo.tblInvoiceDetail.InvQuantity) AS On_Hand ,
        dbo.tblAcqDetail.AcqPrice ,
        dbo.tblAcqDetail.AcqPrice
        * ( SUM(DISTINCT dbo.tblAcqDetail.AcqQuantity)
            - SUM(DISTINCT dbo.tblInvoiceDetail.InvQuantity) ) AS Value_Hand
FROM    dbo.tblAcq
        INNER JOIN dbo.tblAcqDetail ON dbo.tblAcq.acqID = dbo.tblAcqDetail.AcqID
        INNER JOIN dbo.tblProduct ON dbo.tblAcqDetail.ProductID = dbo.tblProduct.ProductID
        INNER JOIN dbo.tblInvoiceDetail ON dbo.tblProduct.ProductID = dbo.tblInvoiceDetail.ProductID
        INNER JOIN dbo.tblInvoice ON dbo.tblInvoiceDetail.InvoiceID = dbo.tblInvoice.InvoiceID
GROUP BY dbo.tblProduct.Product ,
        dbo.tblAcqDetail.AcqPrice

2 个答案:

答案 0 :(得分:0)

为了在数学上准确,您不应该使用SUM(DISTINCT fieldname),而只是使用SUM(fieldname)。否则,它将消除碰巧具有相同数量的条目。

就此而言,您不应在查询开头使用DISTINCTGROUP BY已经处理过。{/ p>

如果您认为您的JOIN返回了重复的行(如果您正确执行,则不应该这样做),请在尝试聚合之前使用DISTINCT将它们包装在子查询中。

作为一个例子,消除重复的子查询可以这样写:

SELECT
    Product ,
    SUM(AcqQuantity) AS QtyIN ,
    SUM(InvQuantity) AS QtyOut ,
    SUM(AcqQuantity)
    - SUM(InvQuantity) AS On_Hand ,
    AcqPrice ,
    AcqPrice
    * ( SUM(AcqQuantity)
        - SUM(InvQuantity) ) AS Value_Hand
FROM (SELECT DISTINCT
          dbo.tblProduct.Product ,
          dbo.tblAcqDetail.AcqQuantity,
          dbo.tblInvoiceDetail.InvQuantity,
          dbo.tblAcqDetail.AcqPrice
      FROM
          dbo.tblAcqDetail
          INNER JOIN dbo.tblProduct ON dbo.tblAcqDetail.ProductID = dbo.tblProduct.ProductID
          INNER JOIN dbo.tblInvoiceDetail ON dbo.tblProduct.ProductID = dbo.tblInvoiceDetail.ProductID
          INNER JOIN dbo.tblInvoice ON dbo.tblInvoiceDetail.InvoiceID = dbo.tblInvoice.InvoiceID ) productInfo
GROUP BY Product, AcqPrice

答案 1 :(得分:0)

基于PinnyM的回答,您不需要DISTINCT,我使用表别名重新编写您的查询:


SELECT
        P.Product ,
        SUM( AcD.AcqQuantity) AS QtyIN ,
        SUM( InD.InvQuantity) AS QtyOut ,
        SUM( AcD.AcqQuantity)
        - SUM( InD.InvQuantity) AS On_Hand ,
        AcD.AcqPrice ,
        AcD.AcqPrice
        * ( SUM(AcD.AcqQuantity)
            - SUM( InD.InvQuantity) ) AS Value_Hand
FROM    dbo.tblAcq Ac
        INNER JOIN dbo.tblAcqDetail  AcD ON Ac.acqID = AcD.AcqID
        INNER JOIN dbo.tblProduct P ON AcD.ProductID = P.ProductID
        INNER JOIN dbo.tblInvoiceDetail InD  ON P.ProductID = InD.ProductID
        INNER JOIN dbo.tblInvoice Inv ON InD.InvoiceID = Inv.InvoiceID
GROUP BY P.Product ,
         AcD.AcqPrice

通过阅读此查询,我不明白为什么需要表dbo.tblInvoice,它不是聚合的一部分。

您仍然看到不同产品的原因是因为您将两列P.Product, AcD.AcqPrice分组,而不仅仅是产品,在您的返回结果中,您可以看到它们的组合是唯一的。