Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

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

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