2013-03-16 1 views
1

SQL Server 2008 R2SQL en cours d'exécution totale - "manque" des valeurs

données Exemple:

ownership exact_opening_date 
Type1  3/1/2002 
Type1  1/4/2004 
Owned  3/1/2002 
Owned  3/31/2003 
Owned  6/30/2004 

Je veux obtenir un total en cours d'exécution par année par type de propriété, mais garder le total va courir même quand il n'y a pas une valeur en cette année:

ownership open_date run_total 
Type 1 2002  1 
Type 1 2003  1 <-- here's my trouble 
Type 1 2004  2 

je peux obtenir le total en cours d'exécution, mais je ne suis pas sûr comment inclure que l'exécution totale lorsque je n'ai pas vraiment une valeur cette année-là.

Voici ce que je fais maintenant:

WITH cte (
ownership 
,open_date 
,ct 
) 
AS (
    SELECT ownership 
     ,year(exact_opening_date) AS open_date 
     ,count(*) AS ct 
    FROM studio_master 
    GROUP BY ownership 
     ,year(exact_opening_date) 
    ) 
SELECT d1.ownership 
    ,d1.open_date 
    ,sum(d2.ct) AS run_total 
FROM cte d1 
LEFT JOIN cte d2 ON d1.open_date >= d2.open_date 
    AND d1.ownership = d2.ownership 
GROUP BY d1.ownership 
    ,d1.open_date 
    ,d1.ct 
ORDER BY d1.ownership 
    ,d1.open_date 

Comment puis-je obtenir les « disparus » en cours d'exécution total des années là-bas?

Répondre

4

Vous pouvez utiliser une liste d'années pour vous joindre.

Vous pouvez utiliser « la méthode CTE croisée joint de Itzik » de la réponse à cette question accpted comme source pour la liste des années: SQL, Auxiliary table of numbers

+0

Merci. Je ne peux pas dire que je comprends tout à fait cela pour le moment, mais j'ai réussi à le faire fonctionner. – duffn

+0

'E00' est une table logique avec deux lignes; puis chaque croix CTE successive joint la précédente contre elle-même ce qui équivaut au nombre de lignes, donc 'E02' a 4,' E04' a 16, 'E08' a 256 etc .. A la fin, il prend le' ROW_NUMBER() 'sur toutes les lignes pour obtenir tous les nombres naturels jusqu'à 4 milliards. L'optimiseur de requête est très bon pour savoir où il peut arrêter de générer des lignes logiques, mais c'est _best_ de le faire correctement lorsque vous prenez 'TOP n '. Je n'ai pas souvent eu besoin d'une table de pointage, mais quand je le fais, j'ai mis en place une vue en utilisant cette méthode. – MattW

Questions connexes