Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  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 :
    SELECT SUM(total) AS total FROM rap_res GROUP BY uid
    et pour mon second besoin
    Code :
    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 820
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 820
    Points : 24 812
    Points
    24 812

    Par défaut

    Code :
    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 :
    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 820
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 820
    Points : 24 812
    Points
    24 812

    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 :
    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 :
    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 Frédéric
    Inscrit en
    juin 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 820
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 820
    Points : 24 812
    Points
    24 812

    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 !

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •