簡體   English   中英

SQL查詢中的多個SUM,包括LEFT JOIN

[英]Multiple SUM in SQL Query including LEFT JOIN

我想顯示特定客戶的所有工作訂單,以及他欠我們的款項。

我的問題是,在當前查詢中,一旦有一個以上的產品(“ Work_Order_Products”表),乘以“ Work_Order_Products”表返回的記錄數即可。

有辦法解決這個問題嗎? 謝謝

SELECT
    W.ID_WorkOrder AS ID_WorkOrder,
    W.Number AS Number,
    W.Date AS Date,
    C.Name AS Name,
    SUM(WOP.Quantity * WOP.Price) AS totProducts,
    SUM(WOI.Times) AS totTimes
FROM Work_Order W
LEFT JOIN Work_Order_Products WOP ON WOP.ID_WorkOrder = W.ID_WorkOrder
LEFT JOIN Work_Order_Instructions WOI ON WOI.ID_WorkOrder = W.ID_WorkOrder
LEFT JOIN Customers C ON C.ID_WorkOrder = W.ID_Customer
WHERE W.ID_Customer = x
GROUP BY
    ID_WorkOrder,
    Number,
    Date,
    Name

我會嘗試相關子查詢而不是SUM:

更換:

SUM(WOI.Times) AS totTimes

有:

(
    select SUM(WOI.Times) from Work_Order_Instructions WOI
    where
        WOI.ID_WorkOrder = W.ID_WorkOrder

) as totTimes

按照克里斯的建議,這可能會起作用:

SELECT
    W.ID_WorkOrder AS ID_WorkOrder,
    W.Number AS Number,
    W.Date AS Date,
    C.Name AS Name,
    products.ProductCount AS totProducts,
    Instructions.totTimes AS totTimes
FROM Work_Order W
    LEFT JOIN
        (SELECT WOP.ID_WorkOrder, SUM(WOP.Quantity * WOP.Price) AS ProductCount
        FROM Work_Order_Products WOP
        GROUP BY WOP.ID_WorkOrder) AS products
    ON  products.ID_WorkOrder = W.ID_WorkOrder
    LEFT JOIN
        (SELECT WOI.ID_WorkOrder, SUM(WOI.Times) AS totTimes
        FROM Work_Order_Instructions WOI
        GROUP BY WOI.ID_WorkOrder) AS Instructions
    ON Instructions.ID_WorkOrder = W.ID_WorkOrder
    LEFT JOIN Customers C ON C.ID_WorkOrder = W.ID_Customer
WHERE W.ID_Customer = x
GROUP BY
    W.ID_WorkOrder,
    Number,
    Date,
    Name

也就是說,使用括號來創建“子表”,這將需要它們自己的別名。 (這里可能存在語法錯誤。當然,我沒有運行此數據。)

為了避免使用Work_Order_ProductsWork_Order_Instructions表中的Work_Order_Instructions ,請在加入表之前處理匯總。

SELECT
  W.ID_WorkOrder AS ID_WorkOrder
 ,W.Number AS Number
 ,W.Date AS Date
 ,C.Name AS Name
 ,WOP.totProducts
 ,WOI.totTimes
FROM
  Work_Order AS W
LEFT JOIN
  (
    SELECT 
      ID_WorkOrder
      ,SUM(Quantity * Price) AS totProducts
    FROM
      Work_Order_Products
    GROUP BY
      ID_WorkOrder

  ) AS WOP
    ON
    WOP.ID_WorkOrder = W.ID_WorkOrder
LEFT JOIN
  (
    SELECT 
      ID_WorkOrder
      ,SUM(Times) AS totTimes
    FROM
      Work_Order_Instructions
    GROUP BY
      ID_WorkOrder
  ) AS WOI
    ON
    WOI.ID_WorkOrder = W.ID_WorkOrder
LEFT JOIN
  Customers AS C
    ON
    C.ID_WorkOrder = W.ID_Customer
WHERE
  W.ID_Customer = x;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM