2016-06-13 80 views
0

使用SQL Server 2012,我有一个脚本,每天向表中插入4行数据。数据是这样的:SQL Server:在数据缺失的日期范围内选择数据

Complete Data

有时一个或多个行的源数据是不完整的没有插入。这看起来是这样的 - 第二列被称为commodityID

Missing Data

有次一个以上行可能会丢失。

我想写一个查询,将显示什么数据丢失,所以对于上面的例子将是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。所以对于上面的例子,它会显示以下内容。

example result

由于我的数据跨越了几年,有奇数缺失的行会有无数的结果。

+0

究竟是你想要什么?你能分享一个excel演示输出吗?或者准确解释你想要什么? –

回答

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