Auteur de questions
Problème avec une vue et une requête SQL

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
- Type modifié Roxana PANAITMicrosoft employee lundi 10 janvier 2011 10:04
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
- Fusionné Roxana PANAITMicrosoft employee mercredi 22 décembre 2010 10:51 crossposting
-
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 -
-
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
-
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 -
-
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 -
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
• 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.
-
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