Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/07/2011, 08h25   #1
Membre du Club
 
Inscription : janvier 2008
Messages : 241
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 241
Points : 62
Points : 62
Par défaut Problème d'agrégat (SUM) et Group BY

Bonjour,

J'essaie maintenant depuis trop longtemps de finaliser une requête qui est censée me retourner la quantité totale des articles livrés par année et par genre d'article et je deviens gentiment taré!

voici un exemple de ma table source (les champs dont j'ai besoin) :

Code :
1
2
3
4
5
6
ARTICLES        QTT     DATE
101d1.50L2.50FO	10	2010-10-01 00:00:00.000
101d1.50L2.50FO	30	2010-12-01 00:00:00.000
101d1.50L2.50HO	5	2010-09-16 00:00:00.000
101d1.50L2.50HO	3	2010-10-15 00:00:00.000
101d1.50L2.50HO	20	2011-02-15 00:00:00.000


Le but étant d'arriver à un truc genre :

Code :
1
2
ARTICLE_BRUT        QTT_FO_2010      QTT_HO_2010   QTT_HO_2011
101d1.50L2.50         40             8             20
Les deux dernières lettres sur l'article correspondent au genre d'article pour chacun desquels j'aimerais avoir la quantité par année.

J'ai beau retourner mes clauses group by et mon select dans tous les sens je n'y arrive pas. Le plus souvent la requête me retourne plusieurs lignes pour le même article alors que je n'en veux qu'une. Pour la somme je galère aussi, voici en gros la requête qui m'a donné les moins mauvais résultats :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT	
  LEFT(li_article, len(li_article)-2) AS brut, 
  CASE WHEN RIGHT(li_article,2) = 'FO' AND RIGHT(LEFT(li_date,12),4) = '2010' THEN sum(li_qte) END AS Qte_FO_2010,
  CASE WHEN RIGHT(li_article,2) = 'HO' AND RIGHT(LEFT(li_date,12),4) = '2010' THEN sum(li_qte) END AS QTE_HO_2010
  ...
  ...
FROM
  ma_table
WHERE
  mes_conditions
GROUP BY
  li_article, 
  RIGHT(LEFT(li_date,12),4)
ORDER BY 
  li_article
Et en plus de ça, j'ai plus de 50 "genres" d'articles, je vous laisse donc imaginer la taille de la requête, je pense d'ailleurs que j'aurais meilleurs temps de me lancer dans une requête PIVOT, qu'en pensez-vous?

Enfin bref, si une bonne âme peut m'aider à me dépatouiller avec cette requête j'en serais très très heureux.

D'avance merci et bonne journée.

Julius
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 08h43   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 085
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 085
Points : 1 883
Points : 1 883
Bonjour,
Comme dirait un habitué du forum ( ), la présentation en colonne, c'est de la cosmétique, et c'est l'affaire de l'application. Qui plus est, tu serais obligé de revoir ta requête à chaque ajout d'un genre, et au minimum une fois par an !

Si tu peux "te contenter" d'une ligne par année/genre:
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT	
  LEFT(li_article, len(li_article)-2) AS brut,RIGHT(li_article,2) AS genre,year(li_date) AS annee,sum(li_qte)
FROM
  ma_table
WHERE
  mes_conditions
GROUP BY
  LEFT(li_article, len(li_article) - 2),RIGHT(li_article,2),year(li_date)
ORDER BY 
  li_article

Tatayo.

P.S. J'ai considéré que la colonne date est de type date...
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 08h55   #3
Membre du Club
 
Inscription : janvier 2008
Messages : 241
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 241
Points : 62
Points : 62
Salut tatayo,

Tout d'abord merci pour ta réponse. Ta solution fonctionne parfaitement, les sommes sont justes, c'est tout bon sauf que:

Je tenais particulièrement à avoir mes qtt en colonnes car ces données ne sont qu'une partie des données que l'on me demande d'extraire et de présenter (et de n'avoir qu'une seule ligne par article m'aurait vraiment rendu service).

De plus, j'aurais également voulu avoir les valeurs NULL ou égale à 0!

Bon c'est vrai que je peux aussi faire mumuse à présenter les données comme il se doit dans l'application mais vois-tu je pensais plutôt faire un simple export excel avec toutes ces données puisque de toute façon les destinataires de ces dites données vont les retourner dans tous les sens dans de superbes tableaux excel.....

Y-a-t'il un moyen "simple" de procéder?
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 17h15   #4
Membre du Club
 
Inscription : janvier 2008
Messages : 241
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 241
Points : 62
Points : 62
J'ai finalement gardé la solution proposé par tatayo....

Merci et bonne fin de journée
funkyjul est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h16.


 
 
 
 
Partenaires

Hébergement Web