2016-06-13 4 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 
Смежные вопросы