5

列を持つ2つのテーブル Orderがあります:

OrderID,OrderDate,CID,EmployeeID

そしてOrderItem列を使って:

OrderID,ItemID,Quantity,SalePrice

CustomerID(CID)、顧客ごとの注文数、およびすべての注文の各顧客の合計金額を返す必要があります。

これまでのところ、2 つの個別のクエリがあります。顧客の注文の数を教えてくれます....

SELECT CID, Count(Order.OrderID) AS TotalOrders
FROM [Order]
Where CID = CID 
GROUP BY CID
Order BY Count(Order.OrderID) DESC;

もう 1 つは総売上高です。組み合わせに困ってます…

SELECT CID, Sum(OrderItem.Quantity*OrderItem.SalePrice) AS TotalDollarAmount
FROM OrderItem, [Order]
WHERE OrderItem.OrderID = [Order].OrderID
GROUP BY CID

Access 2010 でやっています。

4

2 に答える 2

2

2 つの既存のクエリをサブクエリアとして使用するクエリを作成し、2 つのサブクエリを で結合しCIDます。ORDER BYサブクエリではなく、親クエリで定義します。

SELECT
    sub1.CID,
    sub1.TotalOrders,
    sub2.TotalDollarAmount
FROM
    (
        SELECT
            CID,
            Count(Order.OrderID) AS TotalOrders
        FROM [Order]
        GROUP BY CID
    ) AS sub1
    INNER JOIN
    (
        SELECT
            CID,
            Sum(OrderItem.Quantity*OrderItem.SalePrice)
                AS TotalDollarAmount
        FROM OrderItem INNER JOIN [Order]
        ON OrderItem.OrderID = [Order].OrderID
        GROUP BY CID
    ) AS sub2
    ON sub1.CID = sub2.CID
ORDER BY sub1.TotalOrders DESC;
于 2012-12-10T20:06:53.177 に答える
2

COUNT(DISTINCT ...)他の SQL エンジンでは次のように使用します。

SELECT CID, 
       Count(DISTINCT O.OrderID) AS TotalOrders, 
       Sum(OI.Quantity*OI.SalePrice) AS TotalDollarAmount 
FROM [Order] O
INNER JOIN [OrderItem] OI
  ON O.OrderID = OI.OrderID
GROUP BY CID 
Order BY Count(DISTINCT O.OrderID) DESC

残念ながらどのアクセスはサポートしていません。代わりに、最初に注文金額を取得してから、注文数を計算する前にそれらを結合できます。

SELECT CID,
       COUNT(Orders.OrderID) AS TotalOrders,
       SUM(OrderAmounts.DollarAmount) AS TotalDollarAmount
FROM [Orders]
INNER JOIN (SELECT OrderID, Sum(Quantity*SalePrice) AS DollarAmount 
      FROM OrderItems GROUP BY OrderID) AS OrderAmounts
  ON Orders.OrderID = OrderAmounts.OrderID
GROUP BY CID
ORDER BY Count(Orders.OrderID) DESC

アイテムのない注文がある顧客を含める必要がある場合 (通常ではありませんが可能です)、 に変更INNER JOINLEFT OUTER JOINます。

于 2012-12-10T19:53:52.923 に答える