sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-fråga för att jämföra produktförsäljning per månad

Case Statement är min bästa sql-vän. Du behöver också en tabell över tid för att generera dina 0 varv under båda månaderna.

Antaganden baseras på tillgången till följande tabeller:

och

Exempel 1 utan tomma rader:

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

RETURER:

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

Exempel 2 med tomma rader:Jag kommer att använda en underfråga (men andra kanske inte) och kommer att returnera en tom rad för varje produkt- och månadskombo.

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

RETURER:

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

Observera att de flesta rapporteringsverktyg kommer att göra denna korstabell eller matrisfunktionalitet, och nu när jag tänker på det har SQL Server 2005 pivotsyntax som också kommer att göra detta.

Här är några ytterligare resurser.CASEhttp://www.4guysfromrolla.com/webtech/ 102704-1.shtml SQL SERVER 2005 PIVOThttp://msdn.microsoft.com/en-us /library/ms177410.aspx



  1. exekvera omedelbart utan att visa poster av Dynamic Select-satsen

  2. Skillnader mellan DATA INFILE och LOAD DATA LOCAL INFILE

  3. TemplateSyntaxError:Fångade ImportError under rendering:kan inte importera namnverktyg

  4. MappingException Edm.String är inte kompatibel med SqlServer.varbinary