0

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

2 回答 2

0

Basing on PinnyM's answer, you don't need DISTINCT, I re-write your query as following using table alias:


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

By reading this query, I don't understand why you need table dbo.tblInvoice, it is not part of aggregation.

The reason you still see different product is because you group by two columns P.Product, AcD.AcqPrice, not only Product, in your return result you can see their combination is unique.

于 2013-04-04T17:15:45.577 回答
0

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

就此而言,您也不应该DISTINCT在查询开始时使用,GROUP BY已经处理了它。

如果您认为您的 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
于 2013-04-04T16:44:34.040 回答