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 :

Aide requête SQL


Sujet :

Langage SQL

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Aide requête SQL
    Bonjour,

    J'ai une requête SQL ou je souhaiterais récupérer les missions qui ont le plus grand nombre d'escale
    J'ai une table mission et une table escale avec idMission en clé étrangère. Une escale appartient à une mission.
    J'ai donc commencé ma requête mais je bloque pour la suite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM MISSION
    JOIN ESCALE ON ESCALE.idMission = MISSION.IDMISSION
    Je ne vois pas comment faire pour récupérer les mission ayant le plus grand nombre d'escale

    Merci de votre aide

  2. #2
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    Bonjour, un ordre by avec une option limits pour limiter le nombre de résultats que tu veux.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je veux autant de résultat qu'il y a de mission avec le nombre maximum d'escale

  4. #4
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM MISSION
    JOIN ESCALE ON ESCALE.idMission = MISSION.IDMISSION
     ORDER BY ESCALE.idMission = MISSION.IDMISSION ASC LIMIT 1;
    J'ai testé cela chez moi je pense que c'est ce que tu veux?

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Cela ne fonctionne pas sous oracle, je viens de tester:
    ORA-00933: SQL command not properly ended
    00933. 00000 - "SQL command not properly ended"

    Cela bloque au niveau du LIMIT

  6. #6
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    En effet sous oracle le limit n'existe pas il faut donc le simuler avec une sous requête je pense en utilisant une clause where et between.

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Pourquoi un between?
    Je pense que je doit compter le nombre d'escale pour chaque idMission dans ma table escale et ensuite chercher le max parmi ce que je viens de compter

  8. #8
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    En fait, si je comprends bien tu veux compter le nombre d’escales par mission et récupérer celles qui en ont le plus.

    Donc compter le nombre d'escales par mission :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT M.IDMISSION, count(*)
         FROM MISSION m
               JOIN ESCALE e ON E.idMission = M.IDMISSION
    group by M.IDMISSION
    NB. J'ai utilisé des alias pour les tables car cela me semble plus synthétique et dès que l'on veut préfixer de nombreux champs, cela devient plus simple

    Maintenant on va essayer d'ordonner les missions en fonction de leur nombre d'escales
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT M.IDMISSION, count(*)
         FROM MISSION m
               JOIN ESCALE e ON E.idMission = M.IDMISSION
    GROUP BY M.IDMISSION
    ORDER BY  count(*) DESC
    Pour autant que je me souviennes Oracle ne connais pas la clause limit. Je crois qu'il y a une clause qui utilise un rowid mais je penses que tu devras utiliser avec une sous requête (non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT * FROM 
    (
      SELECT M.IDMISSION, count(*)
         FROM MISSION m
               JOIN ESCALE e ON E.idMission = M.IDMISSION
      GROUP BY M.IDMISSION
      ORDER BY  count(*) DESC
    )
    WHERE ROWID = 1
    NB : Ici, la clause ORDER BY peut être placée dans la requête ou la sous requête sans modification de la logique

    Cordialement

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai finalement trouvé en faisant une vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE VIEW ESCALESMISSION 
    AS SELECT idMission, COUNT(*) AS totalEscale
    FROM ESCALE
    GROUP BY idMission;
     
    SELECT MISSION.idMission, villeDepart, villeArrivee
    FROM MISSION
    JOIN ESCALE ON ESCALE.idMission = MISSION.idMission
    GROUP BY MISSION.idMission, villeDepart, villeArrivee
    HAVING COUNT(*) = (SELECT MAX(totalEscale) FROM ESCALESMISSION);

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai une autre requête où je souhaite savoir qu'elle est la ville comportant le plus de mission au départ et à l'arrivée confondue.
    J'ai donc fait ceci mais j'ai rien qui s'affiche
    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
    CREATE VIEW VILLEDEPARTMISSION 
    AS SELECT idMission, villeDepart, COUNT(*) AS totalVilleDepart
    FROM MISSION
    GROUP BY idMission, villeDepart;
     
     
    CREATE VIEW VILLEARRIVEEMISSION 
    AS SELECT idMission, villeArrivee, COUNT(*) AS totalVilleArrivee
    FROM MISSION
    GROUP BY idMission, villeArrivee;
     
    SELECT villeDepart, villeArrivee
    FROM MISSION
    GROUP BY villeDepart, villeArrivee
    HAVING COUNT(*) = (SELECT MAX(totalVilleDepart + totalVilleArrivee) FROM VILLEDEPARTMISSION
    JOIN MISSION ON MISSION.idMission = VILLEDEPARTMISSION.idMission
    JOIN VILLEARRIVEEMISSION ON VILLEARRIVEEMISSION.idMission = MISSION.idMission);

  11. #11
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    Je suppose que villes de départ et d'arrivée sont des colonnes de la table mission comme semblent le montrer tes requêtes (je n'ai pas les DDL des tables .

    Je ferais d'abord une requête qui liste les villes (départ et arrivée confondues) pour cela on va utiliser une union

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT idMission, villeArrivee as Ville
    FROM MISSION
    UNION
    SELECT idMission, villeDepart as Ville
    FROM MISSION
    ensuite, tu peux utiliser cette requête comme une sous requête pour obtenir ton résultat (la méthode de mon premier post ou la tienne à ta guise) ou en faire une vue ...

    Cordialement

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Si j'utilise ma méthode, j'aurais donc 3 vues si je comprend bien?

  13. #13
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    Oui, cependant tu n'es pas obligé d'employer des vues, tu peux utiliser des sous requêtes à la place, cela fonctionne aussi bien.

    Cordialement

  14. #14
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Problème résolue. J'ai fait comme ceci:
    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
    CREATE VIEW NBMISSIONVILLE 
    AS SELECT COUNT(*) AS totalMission
    FROM VILLESMISSION
    GROUP BY ville;
     
    CREATE VIEW VILLESMISSION
    AS SELECT idMission, villeArrivee as Ville
    FROM MISSION
    UNION
    SELECT idMission, villeDepart as Ville
    FROM MISSION
     
    SELECT ville
    FROM VILLESMISSION
    GROUP BY ville
    HAVING COUNT(*) = (SELECT MAX(totalMission) FROM NBMISSIONVILLE);
    Pourrais-tu quand même me donner un exemple avec des sous-requêtes

  15. #15
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    As tu testé ce que je t'ai proposé hier à 16 heures? Si cela fonctionne (je n'ai pas Oracle pour vérifier, c'est à base de sous requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT * FROM 
    (
      SELECT M.IDMISSION, count(*)
         FROM MISSION m
               JOIN ESCALE e ON E.idMission = M.IDMISSION
      GROUP BY M.IDMISSION
      ORDER BY  count(*) DESC
    )
    WHERE ROWID = 1
    Pour ta dernière requête, un CTE (http://sqlpro.developpez.com/cours/s...te-recursives/) serait à mon sens plus approprié.

    Cordialement

  16. #16
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    c'est pas plutot rownum que tu voulais utiliser à la place de rowid ?

  17. #17
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Oui, j'ai confondu il y a maintenant quelque temps que je n'ai pas fait d'oracle

  18. #18
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par kevin254kl Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM MISSION
    JOIN ESCALE ON ESCALE.idMission = MISSION.IDMISSION
     ORDER BY ESCALE.idMission = MISSION.IDMISSION ASC LIMIT 1;
    J'ai testé cela chez moi je pense que c'est ce que tu veux?
    Cette solution est parfaitement IMBÉCILE :
    1) elle ne donne pas de solution corecte
    2) elle est spécifique à cette merde qu'est MySQLmerde !

    En effet, il peut y avoir plusieurs réponses !

    Apprenez le SQL. Mon livre comme mon site web peuvent vous y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  19. #19
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Une solution simple et efficace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH A AS 
    (
    SELECT M.IDMISSION, COUNT(*) AS N,
           MAX(count(*)) OVER() AS M
    FROM   MISSION m
           JOIN ESCALE e ON E.idMission = M.IDMISSION
    GROUP BY M.IDMISSION)
    SELECT M.IDMISSION
    FROM   T
    WHERE  M = N;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/11/2007, 22h23
  2. Aide Requête SQL
    Par jjg65 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/07/2007, 10h37
  3. Aide requête SQL - UPDATE phpmyadmin
    Par laulau37 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/06/2007, 10h19
  4. Aide requête sql
    Par viny dans le forum PostgreSQL
    Réponses: 18
    Dernier message: 14/09/2006, 21h31
  5. Aide Requête SQL (UPDATE)
    Par Glowprod dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/07/2006, 14h04

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