Запрос T-SQL не возвращает счетчик 0 - PullRequest
1 голос
/ 22 июня 2010

У меня такое ощущение, что я делаю здесь какую-то глупую ошибку, однако я пытаюсь сделать запрос по двум таблицам.Одна таблица содержит значение, которое я хочу агрегировать, в данном случае я вызвал таблицу StoreCharge.Другая таблица содержит значения, которые я хочу посчитать.

SELECT  StoreCharge.StoreId,
        COUNT(DISTINCT(ISNULL(WholesalerInvoice.WholesalerId,0))) AS Invoices
FROM    StoreCharge 
            LEFT OUTER JOIN
            WholesalerInvoice ON StoreCharge.StoreId = WholesalerInvoice.StoreId
WHERE   StoreCharge.CompanyId = 2
AND         WholesalerInvoice.StoreInvoiceId IS NULL
AND         DATEDIFF(day,WholesalerInvoice.InvoiceDate,'20100627') > =0
AND     DATEDIFF(day,dateadd(day,-7,'20100627'),WholesalerInvoice.InvoiceDate) > 0
GROUP BY    StoreCharge.StoreId

Моя проблема в том, что если в таблице подсчета есть строки, соответствующие предложению WHERE, запрос работает нормально.Однако, когда ни одна строка не соответствует критерию, ничего не возвращается вместо списка значений в StoreCharge со счетчиком 0.

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

ГДЕ оценивается после ЛЕВОГО НАРУЖНОГО СОЕДИНЕНИЯ

Попробуйте переместить фильтр WHERE, связанный с WholesalerInvoice, в OUTER JOIN

SELECT  StoreCharge.StoreId, 
        COUNT(DISTINCT(ISNULL(WholesalerInvoice.WholesalerId,0))) AS Invoices 
FROM    StoreCharge  
    LEFT OUTER JOIN 
    WholesalerInvoice ON StoreCharge.StoreId = WholesalerInvoice.StoreId 
AND DATEDIFF(day,WholesalerInvoice.InvoiceDate,'20100627') > =0 
AND DATEDIFF(day,dateadd(day,-7,'20100627'),WholesalerInvoice.InvoiceDate) > 0 

WHERE   StoreCharge.CompanyId = 2 
GROUP BY    StoreCharge.StoreId

Это отфильтрует необходимые записи WholesalerInvoice и оставит таблицу StoreCharge без изменений.

1 голос
/ 22 июня 2010

Исходя из запроса в примере, вы фактически не используете то, к чему присоединяетесь. Если в запросе нет ничего другого, то подзапрос даст желаемый результат.

SELECT  StoreCharge.StoreId,
        (SELECT COUNT(0) FROM WholesalerInvoice WHERE WholesalerInvoice.StoreId = StoreCharge.StoreId
        AND DATEDIFF(day,WholesalerInvoice.InvoiceDate,'20100627') > =0
        AND DATEDIFF(day,dateadd(day,-7,'20100627'),WholesalerInvoice.InvoiceDate) > 0) [Invoices]
FROM    StoreCharge 
WHERE   StoreCharge.CompanyId = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...