有一个siteOrder
表格,我检查本周网站下的订单,有两列是siteName
和OrderDate
,我只考虑四个网站而忽略其他网站。
但如果没有为这四个网站中的任何网站下订单,那么我希望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而不是显示任何内容
答案 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