Sql 尝试计算多批装运的现有数量和现有价值

Sql 尝试计算多批装运的现有数量和现有价值,sql,sql-server,Sql,Sql Server,我有这个查询,我有一个采集表(传入)和发票表(传出),我试图通过取AVG dbo.tblAcqDetail.AcqPrice*计算传入-传出的QtyOnHand来计算手头的值。当我在Acquisitions表中添加一个行项目,该行项目对于同一项目具有不同的成本时,AVG没有分组,而是显示下面的两个行项目示例。装运端可以处理多行项目 Product QtyIn QtyOut On_Hand AVGPrice Value_OnHand Screws 100 30

我有这个查询,我有一个采集表(传入)和发票表(传出),我试图通过取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


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

因此,您也不应该在查询开始时使用
DISTINCT
groupby
已经处理了这个问题

如果您认为联接返回了重复的行(如果操作正确,就不应该返回重复的行),请在尝试聚合之前使用
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

根据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
通过阅读此查询,我不明白为什么需要table
dbo.tblInvoice
,它不是聚合的一部分


您仍然看到不同产品的原因是,您通过两列对P.product、AcD.AcqPrice进行分组,而不仅仅是产品,在返回结果中,您可以看到它们的组合是唯一的

我尝试不使用distinct,但它返回了同一产品的多行。我不知道为什么。行没有重复,只是没有正确分组或求和。见上表的输出。如果我将DISTINCT包装为子查询仍然不起作用。@user2245667:尝试从联接中删除
tblAcq
表-它在任何地方都不会被使用。如果您可以分别发布每个表的一些示例数据,这也会有所帮助…@user2245667:更新了一个关于在子查询中使用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