2014-03-19 3 views
0

есть таблица siteOrder, где я проверяю заказы, размещенные сайтами на текущей неделе, две колонки, о которых идет речь, - siteName и OrderDate, я рассматриваю только четыре сайта и игнорирую другие.sql server insert missing record

Но если нет помещенного заказа для любого из этих четырех участков, то я хочу 0, который будет отображаться на сайте, а не не отображается ни одной строки, вот мое решение

SELECT SiteName,COUNT(SiteName) AS Completed FROM SiteOrder WHERE SiteName IN ('Site1','Site2','Site3','Site4') 
and DATEPART(mm,OrderDate) = DATEPART(mm,getdate()) 
and DATEPART(yyyy,OrderDate) = DATEPART(yyyy,getdate()) 
and DATEPART(dd,OrderDate) > DATEPART(dd,DATEADD(DAY, 1-DATEPART(WEEKDAY, getdate()), getdate())) 
GROUP BY SiteName 
order by SiteName 

, что дает мне

SiteName Completed 
----------------------- 
Site1    1 
Site2    1 
Site3    1 

обратите внимание, что на сайте 4 отсутствует я хочу, чтобы показывать 0 на сайте 4, а затем не показывая ничего на всех

+0

Проблема в вас где положение. Вы сохранили условия столбца OrderDate. Если для Site4 нет записи, она будет исключена. Я дал решение ниже. – AK47

+0

@ AK47 - Что делать, если у вас нет заказов * на сайте SiteOrders для одного из этих сайтов? –

+1

@ AK47 - um, no. Если строк нет (не только даны критерии даты), для этого сайта этот сайт не может существовать в вашем результирующем наборе. –

ответ

3
select SiteName 
    ,SUM(Case When DATEPART(mm,OrderDate) = DATEPART(mm,getdate()) 
         and DATEPART(yyyy,OrderDate) = DATEPART(yyyy,getdate()) 
         and DATEPART(dd,OrderDate) > DATEPART(dd,DATEADD(DAY, 1-DATEPART(WEEKDAY, getdate()), getdate())) 
       Then 1 
      Else 0 
      End) as Orders 
from SiteOrder where SiteName in ('Site1','Site2','Site3','Site4') 
GROUP BY SiteName 
order by SiteName 
0

Во-первых, попробуйте ру nning только эта часть запроса ...

SELECT SiteName 
FROM SiteOrder 

Это должно показать вам все ваши сайты.

Убедитесь, что Site4 не имеет никаких ведущих или конечных пробелов в имени, поскольку это смущает инструкцию in.

EDIT: Я думаю, что я неправильно понял наш вопрос, вы могли бы добавить строку, используя, если заявление, так что если сайт существует, но не в том, что критерии, а затем отобразить его с 0

+0

Точно, как показал AK47 –

2

Если вы еще не имеют эти значения в другой таблице, вы можете создать четыре строки в подзапрос, а затем использовать LEFT JOIN:

SELECT SiteName,COUNT(SiteName) AS Completed 
FROM (
    select 'Site1' union all 
    select 'Site2' union all 
    select 'Site3' union all 
    select 'Site4' 
) Sites (name) 
LEFT JOIN 
    SiteOrder ON SiteName = Sites.name 
WHERE 
OrderDate > DATEADD(week,DATEDIFF(week,0,getdate()),-1) 
GROUP BY SiteName 
order by SiteName 

Я также попытался придумать альтернативное выражение для OrderDate сравнения. Я считаю, что вы просто хотите, чтобы OrderDate должно быть больше дата предыдущего воскресенье (в воскресенье, предыдущее воскресенье принимаются в тот же день)