2013-01-22 52 views
3

在下面的查詢中,我總結了給定範圍內所有銷售額的所有銷售項目。包括在這個總結中是「sumOfCost」和「sumOfPrice」,我也想要「sumOfProfit」。問題是,因爲它們只是「AS」變量,所以我不確定如何引用它們,而我嘗試「... Blah AS blah,sumOfPrice - sumOfCost = sumOfProfit ...」可悲的是沒有工作!任何可以在查詢中引用MySQL「AS」值的方法?

這裏是我的查詢:

SELECT Sales.SaleID, 
     Sales.StaffID, 
     Sales.CustomerID, 
     Sales.Timestamp, 
     Sales.Refunded, 
     Sales.PaymentType, 
     Staff.Forename AS staffForename, 
     Staff.Surname AS staffSurname, 
     ( 
      SELECT GROUP_CONCAT(Quantity, ' x ', Name) 
      FROM SaleItems 
      WHERE SaleItems.SaleID = Sales.SaleID 
     ) AS itemList, 
     (
      SELECT sum(Cost*Quantity) 
      FROM SaleItems 
      WHERE SaleItems.SaleID = Sales.SaleID 
     ) AS sumOfCost, 
     (
      SELECT sum(Price*Quantity) 
      FROM SaleItems 
      WHERE SaleItems.SaleID = Sales.SaleID 
     ) AS sumOfPrice 
FROM Sales 
     INNER JOIN Staff 
      ON Sales.StaffID = Staff.StaffID 
WHERE Sales.Deleted = '0' 
ORDER BY Timestamp DESC 
LIMIT 0, 15 

道歉查詢的長度,之前優化它更好,但現在我只希望解決這個問題,我已經奮鬥了。

感謝提前:)

+1

爲什麼需要它?如果你想創造條件,你可以使用HAVING子句[而不是WHERE],我相信你可以在ORDER – mkk

+0

@mkk中使用它們,他希望根據子查詢計算結果。 –

+0

是使用從屬子查詢需要更多時間使用聯接更快 –

回答

2

一種替代方法來解決這個問題是一個子查詢包裹整個查詢,

SELECT *, 
     sumOfCost - sumOfPrice AS sumOfProfit 
FROM 
    (
     SELECT Sales.SaleID, 
       Sales.StaffID, 
       Sales.CustomerID, 
       Sales.Timestamp, 
       Sales.Refunded, 
       Sales.PaymentType, 
       Staff.Forename AS staffForename, 
       Staff.Surname AS staffSurname, 
       ( 
        SELECT GROUP_CONCAT(Quantity, ' x ', Name) 
        FROM SaleItems 
        WHERE SaleItems.SaleID = Sales.SaleID 
       ) AS itemList, 
       (
        SELECT sum(Cost*Quantity) 
        FROM SaleItems 
        WHERE SaleItems.SaleID = Sales.SaleID 
       ) AS sumOfCost, 
       (
        SELECT sum(Price*Quantity) 
        FROM SaleItems 
        WHERE SaleItems.SaleID = Sales.SaleID 
       ) AS sumOfPrice 
     FROM Sales 
       INNER JOIN Staff 
        ON Sales.StaffID = Staff.StaffID 
     WHERE Sales.Deleted = '0' 
     ORDER BY Timestamp DESC 
     LIMIT 0, 15 
    ) s 

順便說一句,他們被稱爲ALIAS

ALIAS不能用於計算定義它們的同一級別的原因是因爲服務器在SELECT子句之前執行FROM子句。該ALIAS都在SELECT從句,這裏的操作的完整的SQL命令:

  • FROM子句
  • WHERE子句
  • GROUP BY子句
  • HAVING子句
  • SELECT子句
  • ORDER BY子句

爲了更好性能問題,我寧願使用JOIN而不是subqueries

更新1

SELECT Sales.SaleID, 
     Sales.StaffID, 
     Sales.CustomerID, 
     Sales.Timestamp, 
     Sales.Refunded, 
     Sales.PaymentType, 
     Staff.Forename AS staffForename, 
     Staff.Surname AS staffSurname, 
     COALESCE(a.itemList, '') itemList, 
     COALESCE(b.sumOfCost, 0) sumOfCost, 
     COALESCE(c.sumOfPrice, 0) sumOfPrice, 
     COALESCE(b.sumOfCost, 0) - COALESCE(c.sumOfPrice, 0) AS sumOfProfit 
FROM Sales 
     INNER JOIN Staff 
      ON Sales.StaffID = Staff.StaffID 
     LEFT JOIN 
     ( 
      SELECT SaleID, GROUP_CONCAT(Quantity, ' x ', Name) itemList 
      FROM SaleItems 
      GROUP BY SaleID 
     ) a ON a.SaleID = Sales.SaleID 
     LEFT JOIN 
     (
      SELECT SaleID, sum(Cost*Quantity) sumOfCost 
      FROM SaleItems 
      GROUP BY SaleID 
     ) b ON b.SaleID = Sales.SaleID 
     LEFT JOIN 
     (
      SELECT SaleID, sum(Price*Quantity) sumOfPrice 
      FROM SaleItems 
      GROUP BY SaleID 
     ) c ON c.SaleID = Sales.SaleID 
WHERE Sales.Deleted = '0' 
ORDER BY Timestamp DESC 
LIMIT 0, 15 

更新2

SELECT Sales.SaleID, 
     Sales.StaffID, 
     Sales.CustomerID, 
     Sales.TIMESTAMP, 
     Sales.Refunded, 
     Sales.PaymentType, 
     Staff.Forename AS staffForename, 
     Staff.Surname AS staffSurname, 
     COALESCE(a.itemList, '') itemList, 
     COALESCE(a.sumOfCost, 0) sumOfCost, 
     COALESCE(a.sumOfPrice, 0) sumOfPrice, 
     COALESCE(a.sumOfCost, 0) - COALESCE(a.sumOfPrice, 0) AS sumOfProfit 
FROM Sales 
     INNER JOIN Staff 
      ON Sales.StaffID = Staff.StaffID 
     LEFT JOIN 
     ( 
      SELECT  SaleID, 
         GROUP_CONCAT(Quantity, ' x ', Name) itemList, 
         SUM(Cost*Quantity) sumOfCost, 
         SUM(Price*Quantity) sumOfPrice 
      FROM SaleItems 
      GROUP BY SaleID 
     ) a ON a.SaleID = Sales.SaleID 
WHERE Sales.Deleted = '0' 
ORDER BY TIMESTAMP DESC 
LIMIT 0, 15 
+0

這可能是最好的選擇。感謝您解釋爲什麼最初的概念不會工作:)這很煩人我不得不重新調整查詢記住你... –

+1

@Redgie我會發布'JOIN'版本,並且我認爲有更好的表現。 –

+0

這將是偉大的,謝謝:) –

相關問題