我正在尋找解決這個問題的方法。我有一張名爲LogEntry的表格,用於存儲多個辦公室使用的信息,他們必須在任何給定日期記錄任何進入他們辦公室的訪客。如果沒有遊客進入,他們仍然需要在當天登記「無遊客」。我如何運行一個查詢來提取辦公室未能創建「No Visitors」日誌的所有日期?獲取SQL Server中沒有條目的日期列表
我已經看過this question(和內部鏈接的文章),但即使調整該查詢,我也只能爲辦公室缺少日期條目的日期創建空行,而不指定沒有創建條目的實際辦公室。有沒有辦法做我想做的事情?
declare @temp table (
CDate datetime,
loc_id varchar(50)
)
insert into @temp SELECT DISTINCT entryDate, locationID FROM LogEntry WHERE entryDate >= '05/01/2017' AND entryDate <= '07-31-2017'
;with d(date) as (
select cast('05/01/2017' as datetime)
union all
select date+1
from d
where date < '07/31/2017'
)
select DISTINCT t.loc_id, CONVERT(date, d.date)
FROM d LEFT OUTER JOIN @temp t ON d.date = t.CDate
GROUP BY t.loc_id, d.date
ORDER BY t.loc_id
正如我所說的,這個查詢將返回我的日期範圍中的列表,並提交了一份關於該日期的條目的所有位置,但我想找到一種方法,本質上提取相反的信息:如果某個辦公室(由locationID指定)未在指定日期提交條目,則只返回那些locationID和他們錯過的日期。快一點
select t.loc_id, CONVERT(date, d.date)
FROM d
-- Cross join dates to all available locs
CROSS JOIN (SELECT DISTINCT loc_id FROM @temp) AS Locs
LEFT JOIN
(SELECT loc_id, t.CDate
FROM @temp
GROUP BY loc_id, d.date) AS t ON d.date = t.CDate AND Locs.loc_id = t.loc_id
ORDER BY Locs.loc_id
這應該是::
Sample data
EntryID | locationID | entryDate
=================================
1 1 07-01-2017
2 1 07-02-2017
3 2 07-02-2017
4 1 07-04-2017
Expected Result (for date range of 07-01 to 07-04)
locationID | missedEntryDate
============================
1 07-03-2017
2 07-01-2017
2 07-03-2017
2 07-04-2017
「DISTINCT」無關緊要,並且使用「RIGHT JOIN」而不是「LEFT JOIN」。 – Siyual
我添加了不同,因爲一個位置可以爲給定日期創建多個條目;我只知道他們創造了至少一個。 –
我的意思是,「GROUP BY」將固有地使查詢「DISTINCT」。 – Siyual