Requête SQL de comparer les ventes de produits par mois

J'ai un Statut Mensuel vue de base de données j'ai besoin de créer un rapport basé sur. Les données de la vue ressemble à quelque chose comme ceci:

Category | Revenue  |  Yearh  |  Month
Bikes      10 000      2008        1
Bikes      12 000      2008        2
Bikes      12 000      2008        3
Bikes      15 000      2008        1
Bikes      11 000      2007        2
Bikes      11 500      2007        3
Bikes      15 400      2007        4


... Et ainsi de suite

Le point de vue a une catégorie de produits, des recettes, un an et un mois. Je veux créer un rapport de comparaison de 2007 et de 2008, montrant la valeur 0 pour le mois, avec aucune vente. Ainsi, le rapport devrait ressembler à quelque chose comme ceci:

Category  |  Month  |  Rev. This Year  |  Rev. Last Year
Bikes          1          10 000               0
Bikes          2          12 000               11 000
Bikes          3          12 000               11 500
Bikes          4          0                    15 400


La clé de chose à remarquer, c'est le mois 1 seule un chiffre d'affaires en 2008, et est donc 0 pour 2007. Aussi, 4 mois seulement n'a pas de chiffre d'affaires en 2008, d'où le 0, alors qu'il a chiffre d'affaires en 2007 et encore.

Aussi, le rapport est en réalité financière de l'année donc j'aimerais avoir des colonnes vides avec des 0 dans les deux cas il n'y a pas de ventes à dire 5 mois, soit en 2007 ou en 2008.

La requête que j'ai obtenu ressemble à quelque chose comme ceci:

SELECT 
    SP1.Program,
    SP1.Year,
    SP1.Month,
    SP1.TotalRevenue,
    IsNull(SP2.TotalRevenue, 0) AS LastYearTotalRevenue

FROM PVMonthlyStatusReport AS SP1 
     LEFT OUTER JOIN PVMonthlyStatusReport AS SP2 ON 
                SP1.Program = SP2.Program AND 
                SP2.Year = SP1.Year - 1 AND 
                SP1.Month = SP2.Month
WHERE 
    SP1.Program = 'Bikes' AND
    SP1.Category = @Category AND 
    (SP1.Year >= @FinancialYear AND SP1.Year <= @FinancialYear + 1) AND
    ((SP1.Year = @FinancialYear AND SP1.Month > 6) OR 
     (SP1.Year = @FinancialYear + 1 AND SP1.Month <= 6))

ORDER BY SP1.Year, SP1.Month

Le problème avec cette requête, c'est qu'il ne serait pas de retour de la quatrième rangée dans mon exemple, les données ci-dessus, puisque nous n'avons pas de chiffre d'affaires en 2008, mais nous avons fait en 2007.

C'est probablement une commune de la requête/problème, mais mon SQL est rouillé, après avoir fait front-end développement depuis si longtemps. Toute aide est grandement appréciée!

Oh, btw, je suis à l'aide de SQL 2005 pour cette question, donc si il y a tout utile de nouvelles fonctionnalités qui pourraient m'aider à me le faire savoir.

OriginalL'auteur Jonas Follesø | 2008-08-19