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 16/10/2011, 02h59   #1
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Par défaut Besoin d'aide pour une requête

Bonjour,

J'ai besoin de votre aide pour terminer une requête :

Code :
1
2
3
4
5
SELECT DL.noLivraison, c.nocommande 
FROM detaillivraison Dl, commande C
WHERE C.noClient=10 
AND C.noCommande=Dl.noCommande
AND C.dateCommande BETWEEN '01/06/2000' AND '30/06/2000';
Pour l'instant, j'affiche les numéros de livraison et les commandes pour un client.
Cela donne ceci :

noLivraison      nocommande
100                 1
100                 1
103                 1
101                 1
100                 3
Je voudrais adapter ma requête pour qu'au final elle affiche le/les no de livraison qui a/ont plusieurs commandes donc,
dans cet exemple, j'aurai comme résultat juste : 100 car il a 2 commandes (1 et 3) associées.

Merci pour votre aide précieuse.
johnny2011 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 07h55   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
Bonjour

ce serait bien d'utiliser les balises
Et d'utiliser la norme SQL sur la construction des jointures


Pour ta requête il faut passer par une sous-requête (qui calculera le nombre de commande) et permettra à la requête principale de sélectionner les livraisons adéquates.
Code :
1
2
3
4
5
6
7
 
SELECT  ....
   FROM (SELECT DI.noCommande,  Count(*) AS NB
                FROM detaillivraison DI
                HAVING Count(*) > 1) AS Selection
      INNER JOIN .....
.....
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 08h11   #3
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

Il serait bien pour ce type de question de présenter les tables utilisées. En effet, le modèle du résultat souhaité me paraît étrange. Il semblerait que la commande part de la livraison. Or, dans la pratique, il y a d'abord la commande puis la livraison. Il ne s'agit que d'une impression.

Par ailleurs, le type de jointure employé dans ta requête n'est plus d'actualité depuis plus de 20 ans. Vas voir le lien ci-dessous, il te donnera toutes les explications
http://sqlpro.developpez.com/cours/sqlaz/jointures/.

Pour les dates, tu es certain que ta base données accepte cette forme de date '01/06/2000'. Je pense qu'il serait préférable de faire une requête paramétrée
Code :
C.dateCommande BETWEEN :pDebut AND :pFin
Au passage, je te signale que la charte indique de donner la base de données utilisée en posant sa question.

Il est clair que la requête présentée ne peut pas te retourner le résultat que tu souhaites. Mais pour la corriger, il nous faut plus d'explications

Bon courage
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 10h37   #4
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
c'est comme ça que tu l'adapte:
Code :
1
2
3
4
5
6
7
SELECT DL.noLivraison, count(c.nocommande )
FROM detaillivraison Dl, commande C
WHERE C.noClient=10 
AND C.noCommande=Dl.noCommande
AND C.dateCommande BETWEEN '01/06/2000' AND '30/06/2000'
GROUP BY DL.noLivraison
HAVING count(c.nocommande )>1
bonne chance
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 17/10/2011, 02h36   #5
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Merci pour votre aide. Je suis débutant, vous l'avez remarqué.

Voici les tables utilisées :

table commande :
clé primaire : nocommande
nocommande : integer
datecommande : date
noclient : integer

table detaillivraison :
clé primaire : nolivraison, nocommande, noarticle
nolivraison : integer
nocommande : integer
noarticle : integer
quantitelivree : integer
J'ai besoin des nolivraison des livraisons qui touchent à toutes et chacune des commandes du client 10 fait au mois de juin 2000.

La livraison doit toucher à toutes les commandes (et non pas une des commandes) du client 10 faites au mois de juin 2000. Pour l'essai, il y a 2 commandes concernées, la commande 1 et la commande 3. Il faut donc que la livraison contiennent des articles des deux commandes et non pas d'une seule des deux.

Dans mon premier test que j'ai mis hier, j'ai ajouté le numéro de commande pour vérification :
Code :
1
2
3
4
5
SELECT DL.noLivraison, c.nocommande 
FROM detaillivraison Dl, commande C
WHERE C.noClient=10 
AND C.noCommande=Dl.noCommande
AND C.dateCommande BETWEEN '01/06/2000' AND '30/06/2000';
Cela me donnait :
noLivraison      nocommande
100                 1
100                 1
103                 1
101                 1
100                 3
Je dois au final juste afficher le numéro de livraison qui a plusieurs commandes différentes (ici 1 et 3).

J'ai changé le code par rapport à votre aide :
Code :
1
2
3
4
5
6
SELECT noLivraison, totalcommande FROM (SELECT DL.noLivraison, count(c.nocommande) AS totalcommande FROM detaillivraison Dl, commande C
WHERE C.noClient=10 
AND C.noCommande=Dl.noCommande
AND C.dateCommande BETWEEN '01/06/2000' AND '30/06/2000'
GROUP BY DL.noLivraison
HAVING count(c.nocommande)> 1);
J'ai ajouté totalcommande pour vérifier le nombre de commande.
Cela donne ceci :
nolivraison  totalcommande
100            3
Il me semble que je devrais avoir 2 comme total des commandes car pour la livraison 100, j'ai peut-être 3 commandes au total mais 2 commandes différentes (la 1 et la 3).
Et donc, je dois revoir quelque chose dans la requête.
Je me trompe peut-être ?

Merci d'avance pour votre aide.
johnny2011 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 08h40   #6
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

Il serait bien de nous donner les éléments inclus dans les tables commande et detaillivraison.

Si je comprends bien, la clé primaire de la table Commande est NoCommande. Or, il n'est pas possible, dans une clé primaire, d'avoir plusieurs commandes qui soient numérotées 1.
Citation:
Cela me donnait :
noLivraison nocommande
100 1
100 1
103 1
101 1
100 3
Tu nous affiches le résultat obtenu, mais ta requête retournes certainement des éléments en doublon.

Pour obtenir une réponse à ta demande, il serait souhaitable de nous fournir des renseignements pour reconstituer les opérations :
  • Le nom de la base de données utilisée ;
  • Les tables nécessaires à la requêtes ;
  • Une présentation des lignes enregistrées dans chacune des tables utilisées dans la requête. (Cinq ou six lignes suivant les exemples)

Avec cela, il sera possible de répondre exactement et de fournir une requête en exemple.
@+
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 10h29   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Il me semble que je devrais avoir 2 comme total des commandes car pour la livraison 100, j'ai peut-être 3 commandes au total mais 2 commandes différentes (la 1 et la 3).
Code :
count(DISTINCT c.nocommande) AS totalcommande
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/10/2011, 13h43   #8
Invité de passage
 
Inscription : octobre 2011
Messages : 5
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : octobre 2011
Messages : 5
Points : 0
Points : 0
Merci skuatamad. Ma requête est correcte maintenant.
johnny2011 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 11h17.


 
 
 
 
Partenaires

Hébergement Web