Базовое соединение TSQL в базе данных Northwind - PullRequest
0 голосов
/ 06 мая 2011

Я изучаю TSQL (ну, просто, если честно, SQL) и хочу сделать статистику Employee - Product в базе данных Northwind.

Ожидаемые результаты должны быть примерно такими:

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

Для всех пар Employy-Product

Моя первая попытка заключается в следующем запросе:

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.

Почему?

edit

Наконец-то я понял:

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 ]

3 голосов
/ 06 мая 2011

Вы можете попробовать:

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

Я переключил его на ЛЕВОЕ СОЕДИНЕНИЕ, так как большинство людей используют их вместо правильных соединений, и, следовательно, их легче обслуживать.

0 голосов
/ 06 мая 2011

Какие результаты вам не хватает?Похоже, вы использовали внутреннее соединение между Order Details Extended и Orders, поэтому любые заказы, в которых нет подробностей, будут исключены.Кажется логичным, что вы захотите этого, так как вы суммируете значение в таблице подробностей.

Затем вы выполняете правильное внешнее объединение с сотрудниками, поэтому вы включаете всех сотрудников, независимо от того, есть ли у них какие-либо заказы.Это также имеет смысл, поскольку похоже, что вы видите, какие сотрудники продали какие продукты.

Ваш запрос даст вам только данные о продуктах, которые сотрудники фактически продали.Если вы ищете все комбинации сотрудников и продуктов, независимо от того, продавал ли этот продукт когда-либо этот сотрудник, вы также захотите присоединиться к таблице Product, хотя в мое запутанное утро я не думаю, что вы захотитевнешнее или перекрестное соединение.

В целом, я думаю, что ваша первая попытка удачная.Довольно сложный для начинающего.Хорошее усилие!

...