p
u
b
l
i
c
i
t
é
publicité
  1. #1

    Inscrit en
    février 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 24
    Points : -3
    Points
    -3

    Par défaut Imbriquer des requetes

    bonjour
    comment faire pour imbriquer des requêtes?
    j'ai bien suivi quelques tutos différents, mais je n'arrive pas à ce que je veut...

    j'ai une première base avec des colonnes :
    rap_res -> uid - livraison - total - date
    et une seconde
    x_world -> uid - pays - ville

    je voudrais calculer la somme des livraisons totales et le nombre de ville
    donc pour la première somme je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(total) AS total FROM rap_res GROUP BY uid
    et pour mon second besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM x_world GROUP BY uid
    j'ai bien moins de ligne sur la table rap_res que sur x_world, don je ne voudrais calculer que en fonction de la première table et obtenir par ligne
    uid - SUM(total) - COUNT(*)
    1 - 10000 - 2
    2 - 526548 - 5
    12 - 2356 - 19
    etc...

    merci d'avance pour votre aide
    xanthos

  2. #2
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    14 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    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 : 14 605
    Points : 28 108
    Points
    28 108

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT x.uid,
    	COUNT(DISTINCT x.ville) AS nb_villes,
    	COUNT(DISTINCT r.livraison) AS nb_livraison
    FROM x_world x
    LEFT OUTER JOIN rap_res r ON r.uid = x.uid
    GROUP BY x.uid
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    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 la suite Linux Mageïa !

  3. #3

    Inscrit en
    février 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 24
    Points : -3
    Points
    -3

    Par défaut

    merci ca fonctionne
    en fait je le faisais dans l'autre sens .... depuis la table rap_res
    par contre ce n'est pas le nombre de livraison que je veut mais bien la somme donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT x_world.uid, x_world.nom, 
    COUNT( DISTINCT x_world.vid ) AS nb_villes, 
    SUM( DISTINCT rap_res.cereales ) AS nb_cereales
    FROM x_world
    JOIN rap_res ON rap_res.uid = x_world.uid
    GROUP BY x_world.uid
    ORDER BY `x_world`.`uid` ASC

  4. #4

    Inscrit en
    février 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 24
    Points : -3
    Points
    -3

    Par défaut

    sauf que du coup je me suis aperçu que ca ne fonctionne pas...
    cela me prends la somme de mes livraisons et que ca me les multiplie par le nb de villes
    exemple si j'ai un vendeur qui a 5 villes et qui vends pour 20.000€ dans 4 villes, le résultat me donne (20.000*4*5) soit 400.000
    je vais contourner en divisant le résultat, mais c'est pas net comme solution non?

  5. #5
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    14 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    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 : 14 605
    Points : 28 108
    Points
    28 108

    Par défaut

    C'est parce que SUM n'a pas de DISTINCT. Bizarre d'ailleurs que MySQL accepte cette syntaxe mais plus rien ne m'étonne de la part du mauvais MySQL !

    Essaie comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT x.uid, x.nom,
    	COUNT(x.vid ) AS nb_villes,
    	r.somme_cereales
    FROM x_world x
    INNER JOIN
    (
    	SELECT uid,
    		SUM(cereales) AS somme_cereales
    	FROM rap_res
    	GROUP BY uid
    ) r ON r.uid = x.uid
    GROUP BY x_world.uid, x_world.nom, r.somme_cereales
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    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 la suite Linux Mageïa !

  6. #6

    Inscrit en
    février 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 24
    Points : -3
    Points
    -3

    Par défaut

    impeccable, j'ai juste rajouté une division (la fin du fin de ce que je voulais)

    la requete finale qui fonctionne est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT x_world.uid, x_world.nom,
    	COUNT(x_world.vid ) AS nb_villes,
    	somme_cereales,
    	(somme_cereales/(COUNT(x_world.vid ))) AS rapport
    FROM x_world
    INNER JOIN
    	(
    		SELECT rap_res.uid,
    			SUM(rap_res.cereales) AS somme_cereales
    		FROM rap_res
    		GROUP BY rap_res.uid
    	) AS toto ---------------------> il faut un alias obligatoirement
    	ON toto.uid = x_world.uid
    GROUP BY x_world.nom
    ORDER BY rapport DESC
    merki beaucoup

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    juin 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juin 2011
    Messages : 442
    Points : 612
    Points
    612

    Par défaut

    Citation Envoyé par CinePhil Voir le message
    C'est parce que SUM n'a pas de DISTINCT. Bizarre d'ailleurs que MySQL accepte cette syntaxe mais plus rien ne m'étonne de la part du mauvais MySQL !
    Extrait de la doc :
    SUM([DISTINCT] expr)
    Returns the sum of expr. If the return set has no rows, SUM() returns NULL. The DISTINCT keyword can be used to sum only the distinct values of expr.

  8. #8
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    14 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    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 : 14 605
    Points : 28 108
    Points
    28 108

    Par défaut

    Au temps pour moi !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    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 la suite Linux Mageïa !

Discussions similaires

  1. soucis avec des requetes "INNER JOIN" Imbriquées
    Par Moutonstar dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 13/11/2008, 12h12
  2. Faire "remonter" les données dans des requetes imbriquées
    Par Earthwormjim dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/08/2006, 17h37
  3. Recuperer les erreurs des requetes sql en asp
    Par emile13 dans le forum ASP
    Réponses: 3
    Dernier message: 01/04/2004, 13h49
  4. Réponses: 12
    Dernier message: 18/03/2004, 15h09
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL-Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo