2009-10-12 2 views
1

У меня есть TSQL запрос, который делает что-то вроде этого:TSQL Group Включив все столбцы

SELECT SUM(s.Amount) as TotalSales, p.ProductName 
FROM SALES s 
INNER JOIN Product p ON s.ProductID = p.ID 
GROUP BY p.ProductName 

Полученный выход является

TotalSales Product 
----------------------- 
123.45  Apples 
234.56  Oranges 
345.67  Grapes 

То, что я хотел бы сделать, это получить все продукты в результаты, даже те, которые не имеют продаж. Я попытался сделать LEFT JOIN в таблице продуктов, но это просто сбивает с толку.

Поэтому я хотел бы, чтобы мой результат был чем-то вроде этого.

TotalSales Product 
----------------------- 
123.45  Apples 
234.56  Oranges 
345.67  Grapes 
0.0   Lemons 
0.0   Grapefruit 

Любая идея, как это сделать?

ответ

4
SELECT SUM(ISNULL(s.Amount,0)) as TotalSales, p.ProductName 
FROM SALES s 
RIGHT JOIN Product p ON s.ProductID = p.ID 
GROUP BY p.ProductName 
+0

Использование RIGHT JOIN повернет вверх NULL 'PRODUCT.PRODUCTNAME' записи на выходе. Правильный подход заключается в LEFT JOIN на необязательную таблицу ('SALES' в этом случае). –

+3

Кстати, постарайтесь не смешивать 'LEFT JOIN' с' RIGHT JOIN' позже, когда этот запрос возник. Он НАПРАВЛЯЕТ ВАШИ ОРЕХА !!! (см. я использую все колпачки, просто думая об этом) – Sung

2
SELECT COALESCE(SUM(s.Amount), 0) as TotalSales, p.ProductName 
FROM Product p 
LEFT JOIN SALES s ON s.ProductID = p.ID 
GROUP BY p.ProductName 
+0

Я думаю, вам нужно обернуть SUM (s.Amount) в коалесценте, чтобы получить «0» – Gratzy

+0

вправо, спасибо. – manji

2

С левой присоединиться (более readeability):

SELECT SUM(ISNULL(s.Amount,0)) as TotalSales, p.ProductName 
FROM Product p 
LEFT JOIN SALES s ON p.ProductID = s.ID 
GROUP BY p.ProductName 
Смежные вопросы