1

次のサンプルデータベーススキーマがあります

http://i.stack.imgur.com/EKNxY.jpg

ここに画像の説明を入力してください

私が欲しいのは:
A)すべての販売、ユーザーごとのグループ化。
B)割引、ユーザーごとのグループ化。

私は次のクエリを使用しています:
FOR A:

    SELECT u.UserID, u.UserName, Sum(d.Quantity * i.Price) AS 'Sales'
FROM OrderDetails d
INNER JOIN Orders o ON o.OrderID = d.OrderID
INNER JOIN Item i ON i.ItemID = d.ItemID
INNER JOIN [User] u ON u.UserID = o.UserID
GROUP BY u.UserID, u.UserName

結果:
UserID UserName Sales
1 Mobeen 11060
2 Cashier 25960

Bの場合:

    SELECT u.UserID, u.UserName, Sum(r.DiscountAmount) AS Discounts
FROM Receipt r
INNER JOIN Orders o ON o.OrderID = r.OrderID
INNER JOIN [User] u ON u.UserID = o.UserID
GROUP BY u.UserID, u.UserName

結果:
UserIDUserName 割引
1Mobeen 50
2 Cashier 310

しかし、その後、両方のクエリを組み合わせることにしましたが、問題は、異なる結果が得られることです。 クエリは次のとおりです。

    SELECT u.UserID,
    u.UserName,
    Sum(d.Quantity * i.Price) AS 'Sales',
    Sum(r.DiscountAmount) AS 'Discounts'
FROM OrderDetails d
INNER JOIN Orders o ON o.OrderID = d.OrderID
INNER JOIN Item i ON i.ItemID = d.ItemID
INNER JOIN [User] u ON u.UserID = o.UserID
INNER JOIN Receipt r ON r.OrderID = o.OrderID
GROUP BY u.UserID, u.UserName

結果:
UserIDUserName 販売割引
1Mobeen 2270502
キャッシャー25760430

4

2 に答える 2

4

問題は、複数の次元に沿って合計していることです。それらを組み合わせる場合は、サブクエリを使用します。

select s.userID, s.userName, s.Sales, d.Discounts
from (SELECT u.UserID, u.UserName, Sum(d.Quantity * i.Price) AS 'Sales'
      FROM OrderDetails d
           INNER JOIN Orders o ON o.OrderID = d.OrderID
           INNER JOIN Item i ON i.ItemID = d.ItemID
           INNER JOIN [User] u ON u.UserID = o.UserID
           GROUP BY u.UserID, u.UserName
     ) s join
     (SELECT u.UserID, u.UserName, Sum(r.DiscountAmount) AS Discounts
      FROM Receipt r
           INNER JOIN Orders o ON o.OrderID = r.OrderID
           INNER JOIN [User] u ON u.UserID = o.UserID
       GROUP BY u.UserID, u.UserName
     ) d
     on s.userId = d.userId and s.userName = d.userName

何が起こっているのかというと、各アイテムのレシートレコードを乗算しているということだと思います。結合を使用してデータを単純にまとめる場合は、十分に注意する必要があります。このような集計の場合、サブクエリはあなたの友達です。

すべての行を取得する必要がある場合(つまり、いずれかの側に不一致がある可能性がある場合)、結合をに切り替えて、full outer join次を使用します。

select coalesce(s.userId, d.userId) as userId, coalesce(s.userName, d.userName) as userName, . . .
于 2013-02-05T15:24:53.813 に答える
0

領収書への内部結合は、おそらく一部の注文を除外し(すべての注文に領収書があるわけではありません)、他の注文を二重にカウントしています(1つの注文に多くの領収書がある場合がありますか?)

于 2013-02-05T15:28:51.763 に答える