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

sql server zobrazující chybějící data

Doporučil bych vám použít table valued function abychom vás dostali všechny dny mezi 2 vybraná data jako tabulku (Vyzkoušejte to v těchto houslích) :

CREATE FUNCTION dbo.GetAllDaysInBetween(@FirstDay DATETIME, @LastDay DATETIME)
RETURNS @retDays TABLE 
(
    DayInBetween DATETIME
)
AS 
BEGIN
    DECLARE @currentDay DATETIME
    SELECT @currentDay = @FirstDay

    WHILE @currentDay <= @LastDay
    BEGIN

        INSERT @retDays (DayInBetween)
            SELECT @currentDay

        SELECT @currentDay = DATEADD(DAY, 1, @currentDay)
    END 

    RETURN
END

(Zahrnuji jednoduché nastavení tabulky pro snadné testy copypaste)

CREATE TABLE SiteVisit (ID INT PRIMARY KEY IDENTITY(1,1), visitDate DATETIME, visitSite NVARCHAR(512))

INSERT INTO SiteVisit (visitDate, visitSite)
    SELECT '2014-03-11', 'site1'
    UNION
    SELECT '2014-03-12', 'site1'
    UNION
    SELECT '2014-03-15', 'site1'
    UNION
    SELECT '2014-03-18', 'site1'
    UNION
    SELECT '2014-03-18', 'site2'

nyní můžete jednoduše zkontrolovat, ve kterých dnech nedošlo k žádné návštěvě, když znáte „hraniční dny“, jako je tento:

SELECT
        DayInBetween AS missingDate,
        'site1' AS visitSite
    FROM dbo.GetAllDaysInBetween('2014-03-11', '2014-03-18') AS AllDaysInBetween
    WHERE NOT EXISTS 
        (SELECT ID FROM SiteVisit WHERE visitDate = AllDaysInBetween.DayInBetween AND visitSite = 'site1')

Nebo pokud chcete vědět o všech dnech, kdy žádná stránka nebyla navštívena, můžete použít tento dotaz:

SELECT
        DayInBetween AS missingDate,
        Sites.visitSite
    FROM dbo.GetAllDaysInBetween('2014-03-11', '2014-03-18') AS AllDaysInBetween
    CROSS JOIN (SELECT DISTINCT visitSite FROM SiteVisit) AS Sites
    WHERE NOT EXISTS
        (SELECT ID FROM SiteVisit WHERE visitDate = AllDaysInBetween.DayInBetween AND visitSite = Sites.visitSite)
    ORDER BY visitSite

Jen na okraj:zdá se, že máte v tabulce nějakou duplicitu (nenormalizovanou) siteName by měl skutečně jít do samostatné tabulky a odkazovat na něj pouze z SiteVisit



  1. SQL select group by a string concat

  2. Důvody, proč v SQL Server 2005 nemají seskupený index

  3. MySQL - Počítání dvou věcí s různými podmínkami

  4. Výjimka nasazení Weblogic:PaddingException:Nelze provést zrušení odsazení:neplatný bajt vyplnění