Ful*_*Fan 1 sql-server sql-server-2008
我有一个表,其中包含需要在一天中定期检查的数据,以确保正确更新.
每一天都应该插入这个表,如下所示:
           CORRECT
|  Date  |  Unit  |  Paid  |
| 1/1/12 | Unit A |  YES   |
| 1/1/12 | Unit B |  YES   |
| 1/2/12 | Unit A |  NO    |
| 1/2/12 | Unit B |  NO    |
因此,对于单元A和单元B,每天应该有数据.但是,有时我的程序不能正确返回数据,我最终会丢失某些日期的数据或接收日期数据,但仅限于一个单元:
          INCORRECT
|  Date  |  Unit  |  Paid  |
| 1/1/12 | Unit A |  YES   |
| 1/3/12 | Unit A |  NO    |
| 1/3/12 | Unit B |  NO    |
单元B的数据缺失1/1/12.单元A和B的数据缺失1/2/12.
我怎么能写一个查询来返回丢失数据的日期以及缺少数据的单位?
您可以使用理货表生成的所有组合Date和Unit.获得所有组合后,您可以使用NOT EXISTS获取丢失的数据.
DECLARE @minDate AS DATE
DECLARE @maxDate AS DATE
SELECT
    @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 c
WHERE NOT EXISTS(
    SELECT * 
    FROM TestData
    WHERE
        [Date] = c.[Date]
        AND Unit = c.Unit
)
结果
|       Date |   Unit |
|------------|--------|
| 2012-01-01 | Unit B |
| 2012-01-02 | Unit A |
| 2012-01-02 | Unit B |
由于Unit将始终是Unit A和Unit B,您可以替换此行:
SELECT DISTINCT Unit FROM TestData
有了这个:
SELECT 'Unit A' AS Unit UNION ALL SELECT 'Unit B'