Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Заявка на SQL Server, която идентифицира липсващи данни за конкретни дати

Можете да използвате Таблица за отчет за генериране на всички комбинации от Дата и Единица . След като получите всички комбинации, можете да използвате NOT EXISTS за да получите липсващите данни.

SQL Fiddle

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' 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инсталация стъпка по стъпка на SQL Server 2017 -2

  2. Как да получа граничните координати за пощенски (пощенски) код в САЩ?

  3. Извличане на първата числова стойност от низ sql

  4. SQL Server REPLACE() срещу TRANSLATE():Какви са разликите?

  5. T-SQL преминава през XML колона с данни, за да извлече уникален набор от пътища