![](/img/trans.png)
[英]How to insert a record if a relation in another table is missing (sql server)?
[英]sql server insert missing record
有一个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,而不是根本不显示任何内容
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.