使用SQL Server 2012,我有一个脚本,每天将4行数据插入表中。数据如下所示:
有时,由于源数据不完整,因此未插入一行或多行。这看起来像这样 - 第二列称为commodityID
:
有时可能会丢失多行。
我正在尝试编写一个查询,告诉我哪些数据缺失,因此对于上面的示例,它将是commodityID = 2
。我有另一个表,它是一个日历(列出所有日期)表,我使用下面的查询来查看所有商品的给定日期是否没有数据。
SELECT *
FROM [Calendar]
WHERE (NOT EXISTS (SELECT ID, CommodityID, Price, DateEntered
FROM Spectron_DailyPricing
WHERE (CONVERT(date, DateEntered) = Calendar.date)))
AND (date BETWEEN '2015-05-14' AND dateadd(day, -1,GETDATE()))
ORDER BY date asc
我希望能够运行一个SQL查询,该查询将查看所有数据并显示日期和缺少的commodityID
。因此,对于上面的示例,它将显示以下内容。
由于我的数据跨越了几年,并且存在奇怪的缺失行,因此会有很多结果。
答案 0 :(得分:2)
WITH
CTE_Numbers AS (
SELECT * FROM (VALUES (1),(2),(3),(4)) AS a(CommodityID)),
CTE_Calendar AS (
SELECT *
FROM [Calendar] c
CROSS JOIN CTE_Numbers n
WHERE c.date BETWEEN '2015-05-14' AND dateadd(day, -1,GETDATE()))
SELECT *
FROM CTE_Calendar c
LEFT JOIN Spectron_DailyPricing s
ON c.CommodityID = s.CommodityID
AND c.date = CONVERT(date, s.DateEntered)
WHERE
s.CommodityID IS NULL
ORDER BY c.date asc