Le Case Statement est mon meilleur ami sql. Vous avez également besoin d'un tableau de temps pour générer votre 0 rev dans les deux mois.
Les hypothèses sont basées sur la disponibilité des tables suivantes :
et
Exemple 1 sans lignes vides :
select
Category
,month
,SUM(CASE WHEN YEAR = 2008 THEN Revenue ELSE 0 END) this_year
,SUM(CASE WHEN YEAR = 2007 THEN Revenue ELSE 0 END) last_year
from
sales
where
year in (2008,2007)
group by
Category
,month
RETOURS :
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
Exemple 2 avec des lignes vides :je vais utiliser une sous-requête (mais d'autres ne le peuvent pas) et renverrai une ligne vide pour chaque combo produit et année mois.
select
fill.Category
,fill.month
,SUM(CASE WHEN YEAR = 2008 THEN Revenue ELSE 0 END) this_year
,SUM(CASE WHEN YEAR = 2007 THEN Revenue ELSE 0 END) last_year
from
sales
Right join (select distinct --try out left, right and cross joins to test results.
product
,year
,month
from
sales --this ideally would be from a products table
cross join tm
where
year in (2008,2007)) fill
where
fill.year in (2008,2007)
group by
fill.Category
,fill.month
RETOURS :
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
Bikes 5 0 0
Bikes 6 0 0
Bikes 7 0 0
Bikes 8 0 0
Notez que la plupart des outils de création de rapports effectueront cette fonctionnalité de tableau croisé ou de matrice, et maintenant que j'y pense, SQL Server 2005 a une syntaxe de pivot qui le fera également.
Voici quelques ressources supplémentaires.CASEhttp://www.4guysfromrolla.com/webtech/ 102704-1.shtml PIVOT SQL SERVER 2005 /bibliothèque/ms177410.aspx