sql server插入缺少的记录

时间:2014-03-19 10:11:56

标签: sql sql-server

有一个siteOrder表格,我检查本周网站下的订单,有两列是siteNameOrderDate,我只考虑四个网站而忽略其他网站。

但如果没有为这四个网站中的任何网站下订单,那么我希望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丢失了我想要对网站4显示0而不是显示任何内容

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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应该大于上一个星期日的日期(在星期日,上一个星期日被当作同一天)

答案 2 :(得分:0)

首先,尝试运行查询的这一部分......

SELECT SiteName 
FROM SiteOrder

这应该会显示您的所有网站。

确保Site4在其名称中没有任何前导或尾随空格,因为这会混淆in语句。

编辑:我认为我误读了我们的问题,您可以使用if语句添加该行,因此如果某个站点存在但不符合该条件,则显示为0

相关问题