2013-07-08 4 views
4

Хорошо ... Я всегда боюсь с LEFT JOINS по какой-то причине в SQL.SQL-запрос LEFT JOIN

У меня есть простой запрос,

SELECT COUNT(*) as OpenedToday, c.Product_Line, c.Product_Code 
FROM SFCase as c 
LEFT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p ON p.Product_Code = c.Product_Code 
WHERE IsClosed = 'false' 
AND DATEPART(YEAR, GETDATE()) = DATEPART(YEAR, CreatedDate) 
AND DATEPART(MONTH, GETDATE()) = DATEPART(MONTH, CreatedDate) 
AND DATEPART(DAY, GETDATE()) = DATEPART(DAY, CreatedDate) 
GROUP BY c.Product_Line, c.Product_Code 

Что я ожидаю, это список всех product_code, с отсчетом о том, сколько дел было OpenedToday (включая нулевые значения). Вместо этого я получаю только список тех кодов продуктов, которые открылись сегодня (только положительные значения).

Когда я запускаю только продукт DISTICT Product_Code, я получаю 70 результатов. Однако, выполняя полный запрос, я получаю только 4 сегодня. Я бы хотел увидеть все 70 результатов, а также нули, если бы ни один случай не был открыт сегодня.

Что я делаю неправильно с этим соединением?

Чарли

+1

ли SFCase только держать дела открылась сегодня? Если нет, как вы расскажете, какие случаи были открыты сегодня - есть ли открытая_дата, например? У вас есть отдельная таблица для хранения всех продуктов? –

+0

, что вы делаете, противоположно. use right external join – chetan

+0

Mark - на самом деле, у моего реального запроса было немного больше ... Я попытался упростить его для форумов. Я обновил вопрос, чтобы показать полный запрос ... Я просто проверяю поле CreateDate, чтобы узнать, было ли оно открыто сегодня или нет. – Charlie74

ответ

2

Try:

SELECT SUM(CASE WHEN IsClosed='false' AND DATEDIFF(DAY, GETDATE(), CreatedDate)=0 
       THEN 1 ELSE 0 END) as OpenedToday, 
     Product_Line, Product_Code 
FROM SFCase 
GROUP BY Product_Line, Product_Code 
+0

Ницца, спасибо Марк. Это делает трюк. Мне понадобится минута, чтобы понять, что ... определенно другой подход, чем то, что я пытался, но это, похоже, дает мне именно то, что я ищу. БОЛЬШОЕ СПАСИБО! – Charlie74

+0

Хорошо ... после прочтения этого заявления CASE ... это имеет смысл. Мне нравится этот подход ... на самом деле я думаю, что это может помочь мне с некоторыми другими запросами, которые я пытаюсь решить, что унаследовал. Я мог бы упростить их, чтобы я мог управлять ими ха-ха. – Charlie74

+0

@ Charlie74: Рад, что я мог бы помочь. –

1
SELECT p.Product_Line, p.Product_Code,COUNT(*) as OpenedToday 
FROM SFCase as c 
RIGHT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p 
ON p.Product_Code = c.Product_Code 
GROUP BY p.Product_Line, p.Product_Code 
+0

К сожалению, это дало те же результаты, что и у меня. – Charlie74