sql >> Database >  >> RDS >> Sqlserver

SQL-query om productverkopen per maand te vergelijken

De Case Statement is mijn beste sql-vriend. Je hebt ook een tijdtabel nodig om je 0 rev in beide maanden te genereren.

Aannames zijn gebaseerd op de beschikbaarheid van de volgende tabellen:

en

Voorbeeld 1 zonder lege rijen:

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

RETOUREN:

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

Voorbeeld 2 met lege rijen:ik ga een subquery gebruiken (maar andere mogen dat niet) en retourneer een lege rij voor elke combinatie van product en jaarmaand.

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

RETOUREN:

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

Merk op dat de meeste rapportagetools deze kruistabel- of matrixfunctionaliteit zullen hebben, en nu ik erover nadenk, heeft SQL Server 2005 een draaisyntaxis die dit ook zal doen.

Hier zijn enkele aanvullende bronnen.CASEhttp://www.4guysfromrolla.com/webtech/ 102704-1.shtml SQL SERVER 2005 PIVOThttp://msdn.microsoft.com/en-us /bibliotheek/ms177410.aspx



  1. Bewaar en herhaal het resultaat van de zoekopdracht in mysqli

  2. PostgreSQL-groeperingsfout

  3. Incrementele statistieken worden NIET gebruikt door de Query Optimizer

  4. Voeg meerdere records uit datagridview in mijn databasetabel in met VB.NET