0

我正在学习 TSQL(好吧,说实话只是 SQL),我想在 Northwind 数据库上进行员工 - 产品统计。

预期的结果应该是这样的:

    EmployeeID | ProductID | income
    1          |         1 |    990
    1          |         2 |    190
    1          |         3 |      0
...

对于所有的雇主-产品对

我的第一次尝试是这个查询:

SELECT E.EmployeeID, OE.ProductID, SUM(OE.ExtendedPrice) as income
FROM [Order Details Extended] OE
JOIN [Orders] O
ON OE.OrderID = O.OrderID
RIGHT OUTER JOIN Employees E
ON E.EmployeeID = O.EmployeeID
GROUP BY E.EmployeeID, OE.ProductID
ORDER BY E.EmployeeID

但我没有得到所有配对的结果。我究竟做错了什么?

HLGEM 错过了一些专栏,但我理解他试图做什么。我想出了这个:

SELECT A.employeeid, A.productid, SUM(Oe.ExtendedPrice) AS income
FROM
    (SELECT E.Employeeid, P.productid 
    FROM employees E
    CROSS JOIN products P) A
LEFT JOIN  [Order Details Extended] OE 
    ON A.productid  = OE.productid  
LEFT JOIN [Orders] O 
    ON OE.OrderID = O.OrderID
GROUP BY A.EmployeeID, A.ProductID 
ORDER BY A.EmployeeID, A.ProductID

这将返回所有对的结果,但这些结果似乎不正确。例如上面的查询返回为第一行:

1, 1, 12788.10

但是这个查询:

SELECT SUM(ODE.ExtendedPrice) FROM [Order Details Extended] ODE
LEFT JOIN [Orders] OD
ON ODE.OrderID = OD.OrderID
WHERE OD.EmployeeID = 1 AND ODE.ProductID = 1

返回 990.90。

为什么?

编辑

我终于明白了:

SELECT A.EmployeeId, A.ProductId, ISNULL(SUM(Oe.ExtendedPrice), 0) AS income
FROM
    (SELECT E.Employeeid, P.productid 
    FROM [Employees] E
    CROSS JOIN [Products] P) A
LEFT JOIN [Orders] O 
    ON O.EmployeeID = A.EmployeeID
LEFT JOIN  [Order Details Extended] OE 
    ON A.productid  = OE.productid  AND OE.OrderID = O.OrderID
GROUP BY A.EmployeeID, A.ProductID 
ORDER BY A.EmployeeID, A.ProductID

@HLGEM,您可以将此解决方案复制/粘贴到您的答案中,以便我接受。

4

2 回答 2

3

你可以试试:

SELECT A.employeeid,A.product_id, SUM(Oe.ExtendedPrice) AS income
FROM
    (SELECT E.Employeeid, P.product id 
    FROM employee E
    CROSS JOIN product p) A
LEFT JOIN  [Order Details Extended] OE 
    ON A.EmployeeID = O.EmployeeID
LEFT JOIN [Orders] O 
    ON OE.OrderID = O.OrderID  
GROUP BY A.EmployeeID, OE.ProductID 
ORDER BY A.EmployeeID

我将其切换为左连接,因为大多数人使用它们而不是右连接,因此它们更易于维护。

于 2011-05-06T13:43:11.350 回答
0

你缺少什么结果?看起来您在 and 之间使用了内部连接Order Details ExtendedOrders因此任何没有详细信息的订单都将被排除在外。您想要这个似乎是合乎逻辑的,因为您正在对详细信息表中的值求和。

然后,您与员工进行右外连接,因此您包括所有员工,无论他们是否有任何订单。这也是有道理的,因为您看起来好像看到了哪些员工销售了哪些产品。

您的查询只会为您提供员工实际销售的产品的数据。如果您正在寻找所有员工-产品组合,无论该员工是否曾经销售过该产品,您都会想要加入Product表格,尽管在我混乱的早晨,我想不出您是否想要外部加入或交叉连接。

总而言之,我认为你的第一次尝试是一个很好的尝试。对于初学者来说相当复杂。好努力!

于 2011-05-06T12:40:44.330 回答