IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

requete avec produit cartesien


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut requete avec produit cartesien
    Dans la requete suivante j'ai un produit cartesien et je ne trouve pas ce qui cloche.
    Je souhaite avoir le nom, le prenom, grade, discipline et les 3 totaux, or la requete me ramène 3 lignes par nom mais une seule est juste :
    merci pour votre aide
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    SELECT COALESCE(totalEns,0) + COALESCE(totalDecharge,0) As total, totalEns, totalDecharge, a.user_nom, a.user_prenom, a.discipline_libelle, a.grade_libelle
    FROM
    (SELECT sum(nbre_heure_devant_etu*type_heure_coef) AS totalEns, user_nom, user_prenom, discipline_libelle, grade_libelle
    FROM ((((utilisateur INNER JOIN enseignement ON
    enseignement.user_id = utilisateur.user_id) INNER JOIN grade ON
    utilisateur.grade_id = grade.grade_id) INNER JOIN discipline ON
    utilisateur.discipline_id = discipline.discipline_id) INNER JOIN type_heure ON
    enseignement.type_heure_id = type_heure.type_heure_id) INNER JOIN annee ON
    enseignement.annee_id = annee.annee_id
    WHERE
     ( enseignement.annee_id=annee.annee_id and annee.annee_temoin=1 )
    GROUP BY utilisateur.user_nom) AS a
    CROSS JOIN 
    (SELECT sum(total_heure_decharge) AS totalDecharge, user_nom, user_prenom, discipline_libelle, grade_libelle
    FROM ((((utilisateur INNER JOIN decharge ON
    decharge.user_id = utilisateur.user_id) INNER JOIN discipline ON
    utilisateur.discipline_id = discipline.discipline_id) INNER JOIN grade ON
    utilisateur.grade_id = grade.grade_id) INNER JOIN annee ON
    decharge.annee_id = annee.annee_id) INNER JOIN annee annee1 ON
    decharge.annee_id = annee1.annee_id
    WHERE 
     ( decharge.annee_id=annee.annee_id and annee.annee_temoin=1 )
    GROUP BY utilisateur.user_nom) AS b

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 091
    Points : 28 362
    Points
    28 362
    Par défaut
    Quel est ce SGBD pour lequel on peut retourner dans la clause SELECT des colonnes non agrégées qui n'apparaissent pas dans la clause GROUP BY ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut sgbd mysql
    Je suis sous Mysql

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 091
    Points : 28 362
    Points
    28 362
    Par défaut
    Avez-vous regardé le résultat de chacune des parties de la requête pour essayer de comprendre où se trouvait de problème ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut requetes séparée ok
    Oui les deux requete séparée fonctionnent car je les ai justement construite séparemment et elles me ramènent bien une ligne par nom.
    La requete fontionne également si je précise un nom dans la clause where.
    Le problème c'est quand je veux une ligne par nom pour tous les noms

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 091
    Points : 28 362
    Points
    28 362
    Par défaut
    Ce n'est peut être pas un CROSS JOIN qu'il faut faire...
    Je verrais bien plutôt un FULL OUTER JOIN
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut erreur de syntaxe
    Cela ne passe pas j'ai une erreur de syntaxe

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 091
    Points : 28 362
    Points
    28 362
    Par défaut
    Il faut une condition de jointure avec le FULL JOIN
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut tjs erreur de syntaxe
    Mysql ne me le prend pas, si je remplace cross join par full join j'ai une erreur de syntatxe, je ne peux pas executer la requete.
    J'ai fait un test avec inner join, la requete s'execute mais les lignes ramenées ssont aussi fausses qu'avec cross join

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 091
    Points : 28 362
    Points
    28 362
    Par défaut
    Alors avec une union des deux parties et un regroupement
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    je ne comprends pas bien :
    je remplace cross join par union ?
    et le regroupement, un group by ? je le mets où ?
    merci

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 091
    Points : 28 362
    Points
    28 362
    Par défaut
    Je vais être gentil... mais que ça ne se renouvelle pas
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    SELECT  SUM(totalEns + totalDecharge)   AS total
        ,   SUM(totalEns)       AS totalEns
        ,   SUM(totalDecharge)  AS totalDecharge
        ,   user_nom
        ,   user_prenom
        ,   discipline_libelle
        ,   grade_libelle
    FROM    (   SELECT  SUM(nbre_heure_devant_etu * type_heure_coef) AS totalEns
                    ,   0   AS totalDecharge
                    ,   user_nom
                    ,   user_prenom
                    ,   discipline_libelle
                    ,   grade_libelle
                FROM    utilisateur 
                    INNER JOIN 
                        enseignement 
                        ON  enseignement.user_id = utilisateur.user_id
                    INNER JOIN 
                        grade 
                        ON  utilisateur.grade_id = grade.grade_id
                    INNER JOIN 
                        discipline 
                        ON  utilisateur.discipline_id = discipline.discipline_id
                    INNER JOIN 
                        type_heure 
                        ON  enseignement.type_heure_id = type_heure.type_heure_id
                    INNER JOIN 
                        annee 
                        ON  enseignement.annee_id = annee.annee_id
                WHERE   enseignement.annee_id = annee.annee_id
                    AND annee.annee_temoin = 1 
                GROUP BY utilisateur.user_nom
                    ,   user_prenom
                    ,   discipline_libelle
                    ,   grade_libelle
            UNION
                SELECT  0   AS totalEns
                    ,   SUM(total_heure_decharge) AS totalDecharge
                    ,   user_nom
                    ,   user_prenom
                    ,   discipline_libelle
                    ,   grade_libelle
                FROM    utilisateur
                    INNER JOIN 
                        decharge 
                        ON  decharge.user_id = utilisateur.user_id
                    INNER JOIN 
                        discipline 
                        ON  utilisateur.discipline_id = discipline.discipline_id
                    INNER JOIN 
                        grade
                        ON  utilisateur.grade_id = grade.grade_id
                    INNER JOIN
                        annee
                        ON  decharge.annee_id = annee.annee_id
                    INNER JOIN 
                        annee AS annee1 
                        ON  decharge.annee_id = annee1.annee_id
                WHERE   decharge.annee_id = annee.annee_id 
                    AND annee.annee_temoin = 1
                GROUP BY utilisateur.user_nom
                    ,   user_prenom
                    ,   discipline_libelle
                    ,   grade_libelle
            )
    GROUP BY user_nom
        ,   user_prenom
        ,   discipline_libelle
        ,   grade_libelle
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Je t'envoie tous mes remerciements, ça marche et sans toi je n'aurais jamais trouvé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete avec la valeur NULL
    Par Hinkel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/11/2008, 16h39
  2. Produit cartesien dans une requete
    Par Fred 57220 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/04/2007, 18h42
  3. requete renvoie produit cartesien
    Par 78alex78 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 22/02/2007, 15h43
  4. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  5. Requete avec des décimales
    Par Sandrine75 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/06/2003, 10h18

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