2015-09-25 2 views
1

У меня есть этот SQLГраф все, если даже нулевой

SELECT count(*) AS TotalOrders, [Sell-to Customer No_], [Document Date] 
FROM [Navision4].[dbo].[3S Company A_S$Sales Invoice Header] 
    INNER JOIN [Navision4].[dbo].[3s Statusboard Customer] 
    ON [Navision4].[dbo].[3S Company A_S$Sales Invoice Header].[Sell-to Customer No_] = [Navision4].[dbo].[3s Statusboard Customer].[No_] 
WHERE [Document Date] <= '2015-09-25' 
GROUP BY [Sell-to Customer No_], [Document Date] 

Но это не делает то, что я хочу сделать.

Пример:....

Если у меня есть 3 пункта в [Navision4] [DBO] [3s Statusboard Клиент] [no_]

[No_] 
10 
20 
30 

Но в моей таблице [Navision4] [ДБО ]. [3S Company A_S $ Sales Invoice Header] - это только записи для клиентов 10 и 20.

У меня нет записей для клиента 30, и это не будет возвращено. Но я хочу, чтобы мой SQL возвращал 0 для клиента 30 и не скрывал его.

Как я могу это сделать?

Надежда я иметь смысл :)

+0

Попробуйте LEFT JOIN вместо JOIN. – jarlh

+0

Отметьте свой вопрос в базе данных, которую вы используете (предположительно SQL Server). –

ответ

4

Похоже, вы пытаетесь подсчитать количество счетов-фактур для клиента в каждый день. Если у клиента нет счетов-фактур, вам необходимо сделать левое соединение, присоединив таблицу счетов-фактур к таблице клиентов следующим образом: http://sqlfiddle.com/#!6/d7cb3a/6. В случае нулевой даты выберите 0, иначе счетчик (*).

select customer.id, invoice.dt, 
case when invoice.dt is null then 0 else count(*) end as TotalOrders 
from customer 
left join invoice 
on invoice.customer = customer.id 
and invoice.dt <= '2015-09-25' 
group by customer.id, invoice.dt 

Если вы пытаетесь найти общее количество счетов для клиента, а затем взять дату из отборного заявления и группы по п следующим образом: http://sqlfiddle.com/#!6/d7cb3a/11

select customer.id, 
case when invoice.customer is null then 0 else count(*) end as TotalOrders 
from customer 
left join invoice 
on invoice.customer = customer.id 
and invoice.dt <= '2015-09-25' 
group by customer.id, invoice.customer 
order by customer.id 

Обратите внимание, что я 'включил invoice.customer в предложение group by, чтобы вы могли проверить это поле для NULL.

Я предполагаю, что вы можете перевести мои образцы имен таблиц обратно в структуру вашей базы данных.

0

Вам нужно внешнее соединение. Если Document Date находится в таблице клиентов:

SELECT count(*) AS TotalOrders, c.[No_], [Document Date] 
FROM [Navision4].[dbo].[3s Statusboard Customer] c LEFT JOIN 
    [Navision4].[dbo].[3S Company A_S$Sales Invoice Header] s 
    ON s.[Sell-to Customer No_] = c.[No_] 
WHERE c.[Document Date] <= '2015-09-25' 
GROUP BY c.[No_], [Document Date] ; 

В противном случае, вам нужно переместить условие в п ON:

SELECT count(*) AS TotalOrders, c.[No_], [Document Date] 
FROM [Navision4].[dbo].[3s Statusboard Customer] c LEFT JOIN 
    [Navision4].[dbo].[3S Company A_S$Sales Invoice Header] s 
    ON s.[Sell-to Customer No_] = c.[No_] AND 
     s.[Document Date] <= '2015-09-25' 
GROUP BY c.[No_], [Document Date] ; 

Обратите внимание, что псевдонимы таблиц сделать запрос легче писать и читать.

+0

Спасибо, но я не могу заставить его работать. У меня есть одна запись, в которой TotalOrders равно 1. Но не получите мой No_ 30 и ноль (0) – Kevin

Смежные вопросы