Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL Server, które identyfikuje brakujące dane dla określonych dat

Możesz użyć Tally Table aby wygenerować wszystkie kombinacje Date i Unit . Po uzyskaniu wszystkich kombinacji możesz użyć NOT EXISTS aby uzyskać brakujące dane.

Skrzypce SQL

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
)

Wynik

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

Ponieważ Unit zawsze będzie Unit A i Unit B , możesz zastąpić ten wiersz:

SELECT DISTINCT Unit FROM TestData

z tym:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyłączyć wszystkie ograniczenia wyboru i kluczy obcych w bazie danych w programie SQL Server (przykłady T-SQL)

  2. Zapytanie o wybór danych między dwiema datami w formacie m/d/rrrr

  3. Znajdź brakujące przedziały czasowe w tabeli

  4. Jak zautomatyzować zbieranie danych w rozwoju bazy danych SQL Server

  5. Spróbuj utworzyć tabelę z Select - SQL Server 2008 zgłasza błąd