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

结果:
用户 ID 用户名 销售
1 Mobeen 11060
2 收银员 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

结果:
用户 ID 用户名折扣
1 Mobeen 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

结果:
UserID UserName Sales Discounts
1 Mobeen 2270 50
2 Cashier 25760 430

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

我认为正在发生的事情是您将每个项目的收据记录相乘。在使用联接天真地汇集数据时,您需要非常小心。对于这样的聚合,子查询是你的朋友。

如果您需要获取所有行(即,两边可能不匹配),请将连接切换为 afull outer join并使用:

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

收据的内部连接可能是排除某些订单(并非所有订单都有收据,对)和重复计算其他订单(一个订单可能有很多收据?)

于 2013-02-05T15:28:51.763 回答