2014-09-10 6 views
1

J'essaie de trouver un moyen optimal de remplir les lignes manquantes entre deux dates mensuelles.SQL Server: remplissage des lignes entre deux dates

Voici comment mes données d'entrée ressemble à:

ID Date  Value 
100 8/1/2011 1 
100 10/1/2011 2 
103 8/1/2011 3 

Voici comment a besoin de mon sortie pour ressembler à:

ID Date  Value 
100 8/1/2011 1 
100 9/1/2011 1 
100 10/1/2011 2 
100 11/1/2011 2 
100 12/1/2011 2 ...till current date 
103 8/1/2011 3 
103 9/1/2011 3 
103 10/1/2011 3 
103 11/1/2011 3 
103 12/1/2011 3 ...till current date 

Génération des dates ne sont pas un problème, Cependant, vous ne savez pas comment copier la colonne de valeur dans les plages de dates sans utiliser de boucles, ce qui est plutôt lent.

Toutes les pensées sont très appréciées!

+0

L'icône accolade gribouillis '{} 'dans l'éditeur de poste formatera une section en tant que code, vous sauver de la folie qui est des centaines de'   'qui ne s'alignent jamais tout à fait. –

+0

Vous devriez jeter un oeil à la façon dont la mise en forme fonctionne ici pour ne pas avoir à faire tous ces 'nbsp;' comme Goat déjà dit. Voici un lien vers l'aide à la mise en forme: http://stackoverflow.com/editing-help#code Pour l'instant j'ai changé votre message pour le formatage standard, j'espère que cela vous convient. –

+0

vous remercie pour le formatage! – vinayka

Répondre

1

Vous pouvez utiliser la fonction ROW_NUMBER() et un autojointure pour créer une plage de dates, puis se joindre à ce à votre table date:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Dt) RN 
       FROM Table1) 
     ,cte2 AS (SELECT a.ID 
         ,a.dt BegDt 
         ,ISNULL(b.dt,GETDATE()) EndDt 
         ,a.Value 
       FROM cte a 
       LEFT JOIN cte b 
        ON a.RN = b.RN -1 
        AND a.ID = b.ID) 
     ,dt AS (SELECT CAST('2011-08-01' AS DATE) Dt 
       UNION ALL 
       SELECT DATEADD(month,1,dt) 
       FROM dt 
       WHERE dt < '2011-12-01') --GETDATE() for current 
SELECT a.ID,b.Dt,a.Value 
FROM cte2 a 
JOIN dt b 
    ON b.dt >= a.BegDt 
    AND b.dt < a.EndDT 
ORDER BY ID, DT 

Démo: SQL Fiddle

+0

super, ça marche! Je vous remercie ! – vinayka