繁体   English   中英

sql server插入丢失的记录

[英]sql server insert missing record

有一个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,而不是根本不显示任何内容

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

如果在另一个表中还没有这些值,则可以在子查询中创建四行,然后使用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应该大于上一个星期日的日期(在一个星期日,前一个星期日被视为同一天)。

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

SELECT SiteName 
FROM SiteOrder

这应该向您显示所有站点。

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

编辑:我认为我误解了我们的问题,您可能可以通过使用if语句来添加行,因此,如果网站存在但不属于该条件,则显示为0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM