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 28/11/2010, 10h57   #1
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Par défaut Obtenir liste par client et par article, le dernier prix de vente

Bonjour,
Sous SQL 2000, j'essaie de faire une requête pour obtenir la liste par clients, par article, du dernier prix de vente sur certains documents. (cbmarq étant un incrément de la base)
exemple de ce que je veux obtenir :
Citation:
Clients-article-prix-cbmarq
dupont-table-10,2- 300
dupont-rouet-11,0-456
dupont-radio-8,72 -233
JEANO-lampe-32,0- 7230
JEANO- rouet- 12,3- 345
JEANO -radio- 7,5- 7680
J'ai réussi à faire ceci en mélangeant le résultat de mes recherches "webistiques" :
Code :
1
2
3
4
5
6
SELECT     m.CT_Num, m.AR_Ref, m.cbMarq, m.DL_PrixUnitaire, m.DL_Qte, m.DL_MontantHT, m.DO_Date, m.DO_Domaine, m.DO_Type, m.DO_Piece
FROM         F_DOCLIGNE AS m INNER JOIN
                          (SELECT     CT_Num, AR_Ref, MAX(cbMarq) AS cbMarqMax
                            FROM          F_DOCLIGNE
                            GROUP BY CT_Num, AR_Ref, DO_Domaine, DO_Type) AS tmp ON m.AR_Ref = tmp.AR_Ref AND m.cbMarq = tmp.cbMarqMax
ORDER BY m.CT_Num, m.AR_Ref
( j'ai mis des champs en plus pour me faciliter le contrôle du bon résultat escompté)
Et bien devinez quoi, je poste parce que je n'arrive pas au bon résultat

Cela me donne des lignes en doublons sur l'article. Exemple:
Citation:
dupont-table-10,2- 300
dupont-rouet-11,0-456
dupont-rouet-12,72 -2233

dupont-radio-8,72 -233
JEANO-lampe-32,0- 7230
JEANO- rouet- 12,3- 345
JEANO -radio- 7,5- 7680
Dans cet exemple, je ne voudrais avoir que :
Citation:
dupont-table-10,2- 300
dupont-rouet-12,72 -2233
dupont-radio-8,72 -233
JEANO-lampe-32,0- 7230
JEANO- rouet- 12,3- 345
JEANO -radio- 7,5- 7680
parce que pour DUPONT le dernier prix de vente de l'article ROUET est bien 12,72 (l'article ROUET pour DUPONT, son plus grand cbMarq est 2233)

En ce jour de dimanche, y aurait-il une bonne âme pour me guider sur les routes de notre seigneur SQL ??


Merci d'avance
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 11h19   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Citation:
cbmarq étant un incrément de la base
Cela signifie t-il qu'il est unique dans la table ?

Si c'est la cas, pourquoi ne pas faire simplement la jointure uniquement sur lui ?
Code :
1
2
3
4
5
6
7
8
9
10
SELECT m.CT_Num, m.AR_Ref, m.cbMarq, m.DL_PrixUnitaire, m.DL_Qte, m.DL_MontantHT, m.DO_Date, m.DO_Domaine, m.DO_Type, m.DO_Piece
FROM F_DOCLIGNE AS m 
INNER JOIN
(
  SELECT CT_Num, AR_Ref, MAX(cbMarq) AS cbMarqMax
  FROM F_DOCLIGNE
  GROUP BY CT_Num, AR_Ref, DO_Domaine, DO_Type
) AS tmp 
  ON m.cbMarq = tmp.cbMarqMax
ORDER BY m.CT_Num, m.AR_Ref
Si ce n'est pas le cas, pourquoi n'y a t-il pas CT_num dans la condition de jointure ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT m.CT_Num, m.AR_Ref, m.cbMarq, m.DL_PrixUnitaire, m.DL_Qte, m.DL_MontantHT, m.DO_Date, m.DO_Domaine, m.DO_Type, m.DO_Piece
FROM F_DOCLIGNE AS m 
INNER JOIN
(
  SELECT CT_Num, AR_Ref, MAX(cbMarq) AS cbMarqMax
  FROM F_DOCLIGNE
  GROUP BY CT_Num, AR_Ref, DO_Domaine, DO_Type
) AS tmp 
  ON m.AR_Ref = tmp.AR_Ref 
  AND m.CT_num = tmp.CT_num
  AND m.cbMarq = tmp.cbMarqMax
ORDER BY m.CT_Num, m.AR_Ref
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 18h48   #3
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
bonjour,
merci pour tes propositions.
Mon champ cbMarq est un compteur unique non null.

J'ai essayé tes 2 propositions mais j'ai toujours mes doublons.

Voici un extrait du résultat : Les 2 lignes en rouge me posent pb, je n'en vuex qu'une seule, uniquement celle qui a le cbMarq le plus gd car l'article est en doublon (0674908000)

Citation:
CT_Num AR_Ref cbMarq DL_PrixUnitaire DL_Qte DL_MontantHT DO_Date DO_Domaine DO_Type DO_Piece
C10006 5301216000 462141 16.350000 1.000000 6.350000 2010-07-30 00:00:00 0 7 F1008261
C10006 5601104040 441319 11.940000 5.000000 9.700000 2010-06-30 00:00:00 0 7 F1007448
C10006 ZPORT 473220 17.720000 1.000000 7.720000 2010-08-31 00:00:00 0 7 F1008645
C10007 0061004020 475694 12.220000 5.000000 11.100000 2010-08-31 00:00:00 0 7 F1008646
C10007 0401804013 475700 10.480000 5.000000 2.400000 2010-08-31 00:00:00 0 7 F1008646
C10007 0674908000 560349 18.710000 1.000000 18.710000 2010-11-28 00:00:00 0 6 F1010247
C10007 0674908000 295102 7.920000 2.000000 15.840000 2010-02-26 00:00:00 0 7 F1004789

C10007 0675908000 295101 4.220000 2.000000 8.440000 2010-02-26 00:00:00 0 7 F1004789

Une autre idée ?

Merci
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 09h28   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 629
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 629
Points : 2 614
Points : 2 614
Bonjour,

L'idée générale de la requête étant bonne, êtes vous sur que le group by est le bon ?

Si vous exécutez seulement la sous-requête avez-vous votre doublons qui ressort ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 09h44   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Ma seconde requête regroupe par CT_num et AR_ref et donne le MAX(cbMarq). Il n'est donc aps logique que tu obtiennes deux cbMarq (560349 et 295102) pour le même couple {CT_Num, AR_Ref} (C1007 et 0674908000) !

Et puisque cbMarq est bien unique dans la table, la condition de jointure peut être simplifiée :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT m.CT_Num, m.AR_Ref, m.cbMarq, m.DL_PrixUnitaire, m.DL_Qte, m.DL_MontantHT, m.DO_Date, m.DO_Domaine, m.DO_Type, m.DO_Piece
FROM F_DOCLIGNE AS m 
INNER JOIN
(
  SELECT CT_Num, AR_Ref, MAX(cbMarq) AS cbMarqMax
  FROM F_DOCLIGNE
  GROUP BY CT_Num, AR_Ref, DO_Domaine, DO_Type
) AS tmp 
  ON m.cbMarq = tmp.cbMarqMax
ORDER BY m.CT_Num, m.AR_Ref
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 10h01   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 629
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 629
Points : 2 614
Points : 2 614
Euh dans ton group by, tu as spécifié DO_Domaine et DO_Type c'est pas ca le problème ?

edit: en fait c'est bien ca le problème car dans l'exemple cité, on voit que pour les doublons ces 2 valeurs sont différentes.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 11h13   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
Exact ! Oubli de suppression suite au copier/coller de la première requête !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 17h54   #8
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci beaucoup cela marche mieux !
Toutefois, j'ai voulu peaufiner un peu en ajoutant des filtres pour finalement n'avoir que le dernier prix de vente de certains types de documents :
m.DO_Type = 1, 3, 6 ou 7

Code :
1
2
3
4
5
6
7
8
9
10
SELECT     m.CT_Num, m.AR_Ref, m.cbMarq, m.DL_PrixUnitaire, m.DL_Qte, m.DL_MontantHT, m.DO_Date, m.DO_Domaine, m.DO_Type, m.DO_Piece
FROM         F_DOCLIGNE AS m INNER JOIN
                          (SELECT     CT_Num, AR_Ref, MAX(cbMarq) AS cbMarqMax
                            FROM          F_DOCLIGNE
                            GROUP BY CT_Num, AR_Ref, DO_Domaine, DO_Type) AS tmp ON m.cbMarq = tmp.cbMarqMax
WHERE     (m.AR_Ref = '0003106016') AND (m.CT_Num = 'C17425') AND (m.DO_Type = 1) OR
                      (m.AR_Ref = '0003106016') AND (m.CT_Num = 'C17425') AND (m.DO_Type = 3) OR
                      (m.AR_Ref = '0003106016') AND (m.CT_Num = 'C17425') AND (m.DO_Type = 6) OR
                      (m.AR_Ref = '0003106016') AND (m.CT_Num = 'C17425') AND (m.DO_Type = 7)
ORDER BY m.CT_Num, m.AR_Ref

Mais sur ce test, j'obtenais enfin qu'1 seule ligne...maintenant j'en obtiens 4.

Je suppose que je place mal mes m.DO_Type =
Est-ce que vous savez comment je peux obtenir le même résultat mais avec mes 4 critères en + ?
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 18h31   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 957
Points : 18 163
Points : 18 163
Envoyer un message via MSN à CinePhil
On vient de te dire que DO_Type et Do_domaine ne devraient pas être dans le GROUP BY mais tu les y laisses ! Normal que tu récupères de nouveau des doublons !

Et ton WHERE peut être énormément simplifié :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT m.CT_Num, m.AR_Ref, m.cbMarq, m.DL_PrixUnitaire, m.DL_Qte, m.DL_MontantHT, m.DO_Date, m.DO_Domaine, m.DO_Type, m.DO_Piece
FROM F_DOCLIGNE AS m 
INNER JOIN
(
  SELECT CT_Num, AR_Ref, MAX(cbMarq) AS cbMarqMax
  FROM    F_DOCLIGNE
  GROUP BY CT_Num, AR_Ref
) AS tmp ON m.cbMarq = tmp.cbMarqMax
WHERE m.AR_Ref = '0003106016' 
  AND m.CT_Num = 'C17425' 
  AND m.DO_Type IN (1, 3, 6, 7)
ORDER BY m.CT_Num, m.AR_Ref
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 22h05   #10
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Je n'ai même pas réalisé que j'avais remis ces 2 champs !!!


En tout cas, un grand merci, j'obtiens enfin la bonne information
C'est génial

A+
Merci à vous tous
tibofo 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 22h51.


 
 
 
 
Partenaires

Hébergement Web