sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Query, který identifikuje chybějící data pro konkrétní data

Můžete použít Tally Table vygenerovat všechny kombinace Date a Unit . Po získání všech kombinací můžete použít NOT EXISTS abyste získali chybějící data.

SQL Fiddle

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
)

Výsledek

|       Date |   Unit |
|------------|--------|
| 2012-01-01 | Unit B |
| 2012-01-02 | Unit A |
| 2012-01-02 | Unit B |

Protože Unit bude vždy Unit A a Unit B , můžete nahradit tento řádek:

SELECT DISTINCT Unit FROM TestData

s tímto:

SELECT 'Unit A' AS Unit UNION ALL SELECT 'Unit B'


  1. Předejte Dictionary<string,int> do uložené procedury T-SQL

  2. Oracle nerozlišuje mezi nulami a prázdnými řetězci?

  3. Dynamicky budované horizontální menu

  4. Doktrína 2:Nelze aktualizovat sloupec DateTime na SQL Server 2008apm