2014-03-19 155 views
0

有一個siteOrder表我在這裏查看本週在網站下的訂單,有兩列問題是siteNameOrderDate,我只考慮四個站點而忽略其他站點。sql服務器插入缺失記錄

但是,如果沒有訂單放置任何這四個站點的話,我想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

問題是你Where子句。您已保留OrderDate列的條件。如果Site4沒有記錄,它將被排除。下面給出瞭解決方案。 – AK47

+0

@ AK47 - 如果其中一個網站的'SiteOrders'中沒有任何訂單*,該怎麼辦? –

+1

@ AK47 - 恩,不。如果根本沒有行(不只是給定日期標準),那麼對於該網站,該網站不可能存在於您的結果集中。 –

回答

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

首先不顯示任何內容,嘗試RU只是這部分的查詢...

SELECT SiteName 
FROM SiteOrder 

這應該會顯示你所有的網站。

確保Site4的名稱中沒有任何前導或尾隨空格,因爲這會混淆in語句。

編輯:我想我誤解我們的問題,你也許可以通過if語句使用添加的線,因此,如果一個網站的存在,但在該標準,然後用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應大於上一個星期日的日期(星期日,上一個星期日被視爲同一天)