3

次のクエリでは、指定された範囲内のすべての販売のすべての販売アイテムを合計します。この要約には「sumOfCost」と「sumOfPrice」が含まれていますが、「sumOfProfit」も欲しいです。問題は、それらが「AS」変数にすぎないため、それらを参照する方法がわからず、「... Blah AS blah、sumOfPrice --sumOfCost =sumOfProfit...」という私の試みが残念ながら機能しなかったことです。 !!

これが私の質問です:

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

クエリの長​​さについてお詫び申し上げます。以前は最適化に苦労していましたが、現在はこの問題の解決のみを検討しています。

前もって感謝します :)

4

1 に答える 1

2

この問題を解決する 1 つの方法は、クエリ全体をサブクエリでラップすることです。

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定義された同じレベルでの計算に使用できない理由は、サーバーが句のFROM前にSELECT句を実行するためです。これらALIASSELECT節にあります。完全な 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
于 2013-01-22T11:10:50.743 に答える