none
Problème avec une vue et une requête SQL RRS feed

  • Discussion générale

  • Bonjour,

    J'ai une tables de ventes avec les colonnes suivantes : pays_id, produit_id, année, mois, qté

    qui ressemble à ça :

    1,1,2009,1,19
    1,1,2010,1,20
    1,2,2009,2,21
    1,2,2010,2,35
    ...

    Toutes les valeurs sont des entiers.

    Je voudrais faire une vues qui m'affiche dans deux colonnes distincte : le total 2009, le total 2010 et la différence des deux

    Elle ressemblerai à ça, colonne : pays_id, produit_id, total 2009, total 2010, dif 2009-2010

    1,1,200,250,50

    mon problème étant :

    - le total doit être calculé par pays et par produit et je ne sais pas faire la requête pour faire une somme des quantité pour les différents pays par différents produit pour l'année 2009 et aussi l'année 2010.

    Je vois même pas à quoi pourrais ressembler cette requête.

    Cette vue aura pour but de simplifier mon rapport contenant la liste de tous mes pays avec les produits qu'ils ont vendu par mois ainsi que le total 2010 et 2009, et l'écart:

    pour donner un truc comme ça

    Pays -  Produit - JAN - FEV - ... - NOV - TOTAL 2010 - TOTAL 2009 - MOYENNE - ECART

    France Produit1 pour janvier nombre de qté vendue 1 pour février nombre de qté vendue 2 ... pour novembre nombre de qté vendue 4, total 2010, total 2009, moyenne serait tota 2010 / 11 (en est en novembre) et l'écart 2010 - 2009.

     

    Est-ce possible ?

    Merci

    mardi 21 décembre 2010 10:22

Toutes les réponses

  • Hi all,

    I have a table with column : country_id, product_id, year, month, salesqty

    the select * from sales would be like this :

    1,1,2009,1,3
    1,1,2010,1,5
    2,1,2009,2,4
    ...

    And I would like to have the column : country_id, product_id, Total 2009, Total 2010, 2009 vs 2010.

    It is possible ?

    Thank you

    mardi 21 décembre 2010 10:11
  • Bonjour,

    Quelque chose qui pourra vous aider a avancer :

    DECLARE @T TABLE
    (
     pays_id INT,
     produit_id INT, 
     annee INT, 
     mois INT, 
     qte INT
    )
     
    INSERT @T VALUES (1,1,2009,1,19)
    INSERT @T VALUES (1,1,2010,1,20)
    INSERT @T VALUES (1,2,2009,2,21)
    INSERT @T VALUES (1,2,2010,2,35)
     
    ;WITH CTE 
    AS
    (
      SELECT pays_id, produit_id, [2009], [2010] 
      FROM (SELECT pays_id, produit_id, qte, annee FROM @T) AS source
      PIVOT
      (
      SUM(qte)
      FOR annee IN ([2009], [2010])
      ) AS P
    )
    SELECT pays_id, produit_id, [2009], [2010], [2010] - [2009] AS diff
    FROM CTE
    

    PS : Meme si cela reste de la cosmetique ....

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    mardi 21 décembre 2010 13:18
    Modérateur
  • Hi,

    Please see the solution on the next post (below)

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    mardi 21 décembre 2010 13:19
    Modérateur
  • Merci pour votre réponse

    Par contre vous me mettez 4 insert mais j'avais mis des ... pour justement spécifier qu'il y en avait plus que 4, j'en ai une dixaine de millier et pourquoi refaire cette table alors que je l'ai déjà ?

    Serait il possible de rendre celà plus simple ?

    Merci de votre aide

    J'ai réussi grâce à mon select d'avoir la quantité de pièce vendue pour 2010 :

    SELECT   dbo.country.country, dbo.product.code, SUM(dbo.sales.quantity) AS [QTY 2010]
    FROM     dbo.country 
    INNER JOIN
               dbo.sales ON dbo.country.id = dbo.sales.country_id 
    INNER JOIN
               dbo.product ON dbo.sales.product_id = dbo.product.id
    GROUP BY dbo.country.country, dbo.product.code, dbo.sales.year
    HAVING   (dbo.sales.year = 2010)
    ORDER BY dbo.country.country, dbo.product.code

     

    mardi 21 décembre 2010 14:23
  • La table n'est ici qu'a titre d'exemple. Vous pouvez remplacer la variable de table que j'ai mis par votre table.

    J'essairai de vous proposer une autres solution qd j'aurais le temps. Quelle version de SQL Server au fait ?

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    mardi 21 décembre 2010 15:18
    Modérateur
  • SQL Server 2008, merci bcp pour votre aide
    mercredi 22 décembre 2010 08:51
  • En reprenant vos tables a vous cela peut donner (dans une syntaxe peut etre un peu plus simple) :

    ;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
    mercredi 22 décembre 2010 10:14
    Modérateur
  • Bonjour,

     

    Merci de tenir au courant tous vos threads: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/26ae7d0c-e643-4c1b-a6be-f790a3f1d117/ et de poster la solution.

    Merci,

     

    Cordialement,

    Roxana

     



    Roxana PANAIT, MSFT  Follow TechNetFr on Twitter 

    • Votez l’article qui vous est utile ou postez un pour participer au concours : Appel à la contribution

    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 22 décembre 2010 10:49
  • Pour finir je suis arrivé à cette solution :

    SELECT dbo.trade.abrev, dbo.zone.zone, dbo.company.company, dbo.country.country, dbo.product.code, dbo.product.product, dbo.brand.brand, dbo.type.type, 
    { fn IFNULL(SUM(CASE WHEN month = 1 AND year = year(Getdate()) THEN quantity END), 0) } AS JAN,
    { fn IFNULL(SUM(CASE WHEN month = 2 AND year = year(Getdate()) THEN quantity END), 0) } AS FEB,
    { fn IFNULL(SUM(CASE WHEN month = 3 AND year = year(Getdate()) THEN quantity END), 0) } AS MAR,
    { fn IFNULL(SUM(CASE WHEN month = 4 AND year = year(Getdate()) THEN quantity END), 0) } AS APR,
    { fn IFNULL(SUM(CASE WHEN month = 5 AND year = year(Getdate()) THEN quantity END), 0) } AS MAY,
    { fn IFNULL(SUM(CASE WHEN month = 6 AND year = year(Getdate()) THEN quantity END), 0) } AS JUN,
    { fn IFNULL(SUM(CASE WHEN month = 7 AND year = year(Getdate()) THEN quantity END), 0) } AS JUL,
    { fn IFNULL(SUM(CASE WHEN month = 8 AND year = year(Getdate()) THEN quantity END), 0) } AS AUG,
    { fn IFNULL(SUM(CASE WHEN month = 9 AND year = year(Getdate()) THEN quantity END), 0) } AS SEP,
    { fn IFNULL(SUM(CASE WHEN month = 10 AND year = year(Getdate()) THEN quantity END), 0) } AS OCT,
    { fn IFNULL(SUM(CASE WHEN month = 11 AND year = year(Getdate()) THEN quantity END), 0) } AS NOV,
    { fn IFNULL(SUM(CASE WHEN month = 12 AND year = year(Getdate()) THEN quantity END), 0) } AS [DEC],
    { fn IFNULL(SUM(CASE WHEN (month < 13) AND year = year(Getdate()) THEN quantity END), 0) } AS [YTD CurYear],
    { fn IFNULL(SUM(CASE WHEN (month < 13) AND year = year(Getdate()) - 1 THEN quantity END), 0) } AS [YTD PrevYear],
    { fn IFNULL(SUM(CASE WHEN (month < 13) AND year = year(Getdate()) THEN quantity END), 0) } - { fn IFNULL(SUM(CASE WHEN month < 13 AND year = year(Getdate()) - 1 THEN quantity END), 0) } AS GAP
    { fn IFNULL(SUM(CASE WHEN (month < 13) AND year = year(Getdate()) THEN quantity END), 0) } / 12 AS AVG,
    { fn IFNULL(SUM(CASE WHEN month = 12 AND year = year(Getdate()) THEN stock END), 0) } AS STOCK, 
    CASE WHEN ({ fn IFNULL(SUM(CASE WHEN (month < 13) AND year = year(Getdate()) THEN quantity END), 0) } / 12) = 0 THEN 0 ELSE { fn IFNULL(SUM(CASE WHEN month = 12 AND year = year(Getdate()) THEN stock END), 0) } / ({ fn IFNULL(SUM(CASE WHEN (month < 13) AND year = year(Getdate()) THEN quantity END), 0) } / 12) END AS [# of month]
    FROM dbo.sales 
    INNER JOIN dbo.product ON dbo.sales.product_id = dbo.product.id 
    INNER JOIN dbo.country ON dbo.sales.country_id = dbo.country.id 
    INNER JOIN dbo.brand ON dbo.product.brand_id = dbo.brand.id 
    INNER JOIN dbo.type ON dbo.product.new = dbo.type.id 
    INNER JOIN dbo.company ON dbo.country.company_id = dbo.company.id 
    INNER JOIN dbo.zone ON dbo.company.zone_id = dbo.zone.id 
    INNER JOIN dbo.trade ON dbo.company.trade_id = dbo.trade.id
    GROUP BY dbo.country.country, dbo.product.product, dbo.product.code, dbo.brand.brand, dbo.type.type, dbo.zone.zone, dbo.company.company, dbo.trade.abrev
    
    
    Par contre je trouve la requête un peu énorme y aurait-il un moyen de l'alléger ?
    
    <br/>Merci beaucoup
    
    
    mercredi 22 décembre 2010 12:54