none
SQL VIEW RRS feed

  • Question

  • Bonjour à tous,

    ça fait pas mal de temps que j'essaie de trouver des réponses à mon problème, mais j'ai l'impression que la solution est assez facile :

    Voilà j'ai une table avec comme colonne Produit, Pays, Qté, Mois, Année

    Je voudrais virer le mois en le groupant par les années ce qui me donnerait un total 2010 et total 2009 et je voudrais l'avoir dans les colonnes.

    C'est à dire avoir comme colonne : Produit, Pays Qté2010, Qté2009

    Et ainsi avoir la possibilité de faire Qté2010-Qté2009

    Est-ce possible ?

    Merci à celui qui m'aidera a trouvé une solution

    mardi 21 décembre 2010 14:11

Réponses

  • Bonjour,

    ;WITH total_annees
    AS
    (
      SELECT 
      C.country, 
      P.code,
      SUM(CASE annee WHEN 2009 THEN qte
          ELSE 0
      END) AS [2009],
      SUM(CASE annee WHEN 2010 THEN qte
          ELSE 0
      END) AS [2010]
      FROM dbo.country AS C
     INNER JOIN dbo.sales AS S
      ON C.id = S.country_id 
     INNER JOIN dbo.product AS P
      ON S.product_id = P.id
      GROUP BY C.country, P.code
    )
    SELECT 
     *, [2010] - [2009] AS diff
    FROM total_annees
     
    ++
    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    • Proposé comme réponse Papy Normand lundi 27 décembre 2010 08:40
    • Marqué comme réponse Alex Petrescu mardi 28 décembre 2010 13:27
    mercredi 22 décembre 2010 10:17
    Modérateur

Toutes les réponses

  • Bonjour mattia

    Essai d'utiliser cette solution SVP :

    --------------------------------------------------------------------
    --------------------------------@TABLE-------------------------------
    --------------------------------------------------------------------
    declare @TAB Table (Pays nvarchar(20), Produit nvarchar(20),[YEAR] int, [MONTH] int, Vente float)
    insert @TAB
    select 'Belgium','Computer',2010,1,10 UNION ALL
    select 'Belgium','Computer',2010,1,5 UNION ALL
    select 'Belgium','Computer',2009,1,2 UNION ALL
    select 'Belgium','Computer',2009,1,10 UNION ALL
    select 'Belgium','Computer',2009,1,10 UNION ALL
    select 'USA','Phone',2010,1,20 UNION ALL
    select 'USA','Phone',2010,1,30 UNION ALL
    select 'USA','Phone',2009,1,10 UNION ALL
    select 'USA','Phone',2009,1,5
    --------------------------------------------------------------------
    --------------------------------QUERY-------------------------------
    --------------------------------------------------------------------
    ;with CTE 
    as (
    select Pays, Produit,[YEAR], SUM(Vente) as avr from @TAB
    Where [YEAR]=2010
    group by Pays, Produit,[YEAR]),
    CTE1 as (select Pays, Produit,[YEAR], SUM(Vente) as avr from @TAB
    Where [YEAR]=2009
    group by Pays, Produit,[Month],[YEAR])
    select C.Pays, C.Produit,C.avr as QTE2010,C1.avr as QTE2009,C.avr-C1.avr as DIFF from CTE C Left Join CTE1 C1 on C.Pays=C1.Pays and C.Produit=C1.Produit
    --------------------------------------------------------------------
    --------------------------------RESULTS-----------------------------
    --------------------------------------------------------------------
    --Belgium Computer 15 22 -7
    --USA  Phone  50 15 35
    

     

     


    Best regards
    mardi 21 décembre 2010 14:50
  • Bonjour,

    ;WITH total_annees
    AS
    (
      SELECT 
      C.country, 
      P.code,
      SUM(CASE annee WHEN 2009 THEN qte
          ELSE 0
      END) AS [2009],
      SUM(CASE annee WHEN 2010 THEN qte
          ELSE 0
      END) AS [2010]
      FROM dbo.country AS C
     INNER JOIN dbo.sales AS S
      ON C.id = S.country_id 
     INNER JOIN dbo.product AS P
      ON S.product_id = P.id
      GROUP BY C.country, P.code
    )
    SELECT 
     *, [2010] - [2009] AS diff
    FROM total_annees
     
    ++
    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    • Proposé comme réponse Papy Normand lundi 27 décembre 2010 08:40
    • Marqué comme réponse Alex Petrescu mardi 28 décembre 2010 13:27
    mercredi 22 décembre 2010 10:17
    Modérateur