Можете да използвате Таблица за отчет
за генериране на всички комбинации от Дата
и Единица
. След като получите всички комбинации, можете да използвате NOT EXISTS
за да получите липсващите данни.
DECLARE @minDate AS DATEDECLARE @maxDate AS DATESELECT @minDate =MIN([Date]), @maxDate =MAX([Date])FROM TestData;WITH E1(N) AS( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1,E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b) ,E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b),Tally(N) AS( SELECT TOP(DATEDIFF(DAY, @minDate, @maxDate) + 1) ROW_NUMBER() OVER(ORDER BY(SELECT NULL )) FROM E4),CteDatesAndUnits([Date], Unit) AS( SELECT DATEADD(DAY, t.N - 1, @minDate), u.Unit FROM Tally t CROSS JOIN ( SELECT DISTINCT Unit FROM TestData )u)SELECT *FROM CteDatesAndUnits cWHERE NOT EXISTS( SELECT * FROM TestData WHERE [Date] =c.[Date] AND Unit =c.Unit)
Резултат
<предварителен код>| Дата | Единица ||------------|--------|| 01.01.2012 | Единица B || 2012-01-02 | Единица А || 2012-01-02 | Единица Б |
Тъй като Единица
винаги ще бъде Единица A
и Единица B
, можете да замените този ред:
ИЗБЕРЕТЕ ОТДЕЛНА единица ОТ TestData
с това:
SELECT 'Unit A' AS Unit UNION ALL SELECT 'Unit B'