我正在学习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您可以将此解决方案复制/粘贴到您的答案中,以便我接受它。
答案 0 :(得分: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
我把它切换到LEFT JOIN,因为大多数人使用它们而不是右连接,因此它们更容易维护。
答案 1 :(得分:0)
你错过了什么结果?您似乎在Order Details Extended
和Orders
之间使用了内部联接,因此任何没有详细信息的订单都将被排除。你想要这个似乎是合乎逻辑的,因为你在详细信息表中总结了一个值。
然后,您与员工进行正确的外部联接,这样您就可以包括所有员工,无论他们是否有任何订单。这也是有道理的,因为看起来你看到哪些员工卖了哪些产品。
您的查询只会为您提供员工实际销售的产品的数据。如果您正在寻找所有员工 - 产品组合,无论员工是否曾经销售该产品,您也会想要加入Product
表,尽管在我糊涂的早晨,我想不出你是否想要外连接或交叉连接。
总之,我认为你的第一次尝试是好的。初学者相当复杂。很好的努力!