在Northwind数据库上进行TSQL基本连接

时间:2011-05-06 12:00:01

标签: sql tsql northwind

我正在学习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您可以将此解决方案复制/粘贴到您的答案中,以便我接受它。

2 个答案:

答案 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 ExtendedOrders之间使用了内部联接,因此任何没有详细信息的订单都将被排除。你想要这个似乎是合乎逻辑的,因为你在详细信息表中总结了一个值。

然后,您与员工进行正确的外部联接,这样您就可以包括所有员工,无论他们是否有任何订单。这也是有道理的,因为看起来你看到哪些员工卖了哪些产品。

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

总之,我认为你的第一次尝试是好的。初学者相当复杂。很好的努力!