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

SQL Oracle Discussion :

Demande d'aide pour une requête


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Demande d'aide pour une requête
    Bonjour,

    Je souhaite effectuer une requête sous Oracle mais je m'embrouille et me perds. Est ce que quelqu'un peut m'aider ?

    Voici mes tables en version simplifiées :

    • PERIODE : numero (int), libelle (string), lundi (bool), mardi (bool), mercredi (bool), jeudi (bool), vendredi (bool), samedi(bool), dimanche (bool)
    • TRAIN : numero (int), periode (int), annee (int)

      Sachant que "numéro" est la clé dans les 2 cas, je cherche à afficher le nombre de trains par année puis par jour.


    Pour l'instant j'arrive juste à afficher les trains par année :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select periode.annee, count(train.numero)
    from train, periode
    where train.periode= periode.numero
    group by periode.annee
    order by periode.annee;

    Est ce que quelqu'un a une idée ? Sachant bien sûr que je ne peux pas modifier ces tables. Merci d'avance !!!

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Tout d'abord la notation
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM Table1, Table2
    n'est plus utilisée depuis des années ! En SQL2 il faut utiliser les opérateurs de jointures.

    Concernant la requête pour le nombre de trains par année, je pense qu'il suffit de faire :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t.annee, count(t.numero)
    FROM train t
    GROUP BY t.annee
    ORDER BY t.annee

    Et pour celle du nombre de trains par période :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.Libelle, COUNT(t.numero)
    FROM train t
        INNER JOIN periode p ON p.numero = t.periode
    GROUP BY p.Libelle
    ORDER BY p.Libelle

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse mais en fait il me faudrait qu'une seule requête pour obtenir un résultat du genre :
    Annee     Jour      Nb_train
    ----------------------------
    2010     lundi           253
    2010     mardi           458
    2010     mercredi        954
    2010     jeudi           686
    2010     vendredi        985
    2010     samedi          281
    2010     dimanche         53
    2011     lundi           659
    2011     mardi           567
    2011     mercredi        211
    2011     jeudi           658
    2011     vendredi        834
    2011     samedi          516
    2011     dimanche         68
    Le résultat est d'abord groupé par année puis par jour de la semaine.

    PS : pour la jointure c'est ce que l'on m'a appris à la fac l'année dernière. Merci pour le tuyau

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Tout d'abord la notation
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM Table1, Table2
    n'est plus utilisée depuis des années ! En SQL2 il faut utiliser les opérateurs de jointures.
    ...
    Non il ne faut pas; ce n’est pas une obligation! C’est juste une question de « préférence » et Oracle est réputé pour un certains nombre des bugs lié justement à l’écriture ANSI.

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Non il ne faut pas; ce n’est pas une obligation! C’est juste une question de « préférence » et Oracle est réputé pour un certains nombre des bugs lié justement à l’écriture ANSI.
    Effectivement c'est une préférence Mais autant prendre les bons réflexes, plutôt que de s'habituer à la vieille notation. Il me semble que les bugs d'Oracle sur ANSI ont été corrigés dans la version 11g, me trompe-je ?

    Concernant la question initiale, alors la requête ressemblerait à quelque chose du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t.annee, p.Libelle, count(t.numero) nombreDeTrains
    FROM train t
        INNER JOIN periode p ON p.numero = t.periode
    GROUP BY p.Libelle, t.annee

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    J'ai trouvé ! Merci pour votre aide

    Voici mon code :
    Code sql : 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
    select train.periode, periode2.Jour, count(train.numero) "Nb de trains"
    from train,
    (select '1 Lundi' Jour, periode.numero from periode where periode.LUNDI = TRUE
    union
    select '2 Mardi' Jour, periode.numero from periode where periode.MARDI = TRUE
    union
    select '3 Mercredi' Jour, periode.numero from periode where periode.MERCREDI = TRUE
    union
    select '4 Jeudi' Jour, periode.numero from periode where periode.JEUDI = TRUE
    union
    select '5 Vendredi' Jour, periode.numero from periode where periode.VENDREDI = TRUE
    union
    select '6 Samedi' Jour, periode.numero from periode where periode.SAMEDI = TRUE
    union
    select '7 Dimanche' Jour, periode.numero from periode where periode.DIMANCHE = TRUE) periode2
    where train.periode = periode.numero
    group by train.periode, periode2.Jour
    order by train.periode;

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Pourquoi autant de sous-requêtes ?

  8. #8
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    et ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     WHERE periode.SAMEDI = TRUE
    
    ca marche ????

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Pourquoi autant de sous-requêtes ?
    Si tu trouves un moyen d'avoir le même résultat aussi bien ordonné avec moins de requête je suis preneuse. Je cherche à ordonner mes résultats d'abord par années, puis par jour comme ceci :

    Annee Jour NbTrain
    --------------------------------------
    2010 lundi 253
    2010 mardi 458
    2010 mercredi 954
    2010 jeudi 686
    2010 vendredi 985
    2010 samedi 281
    2010 dimanche 53
    2011 lundi 659
    2011 mardi 567
    2011 mercredi 211
    2011 jeudi 658
    2011 vendredi 834
    2011 samedi 516
    2011 dimanche 68



    Citation Envoyé par Garuda Voir le message
    et ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     WHERE periode.SAMEDI = TRUE
    
    ca marche ????
    Bien sûr que ça marche puisque si tu regardes comment est faite ma base : "période" est le nom de la table et "samedi" est le nom de la colonne. Cette colonne étant remplie de booléens...

    Exemple :
    Numero Libelle Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche
    -----------------------------------------------------------------
    0 "Du lun au ven" True True True True True False False
    1 "Toute la semaine" True True True True True True True
    2 "Le weekend" False False False False False True True

  10. #10
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par coqrya Voir le message
    Si tu trouves un moyen d'avoir le même résultat aussi bien ordonné avec moins de requête je suis preneuse. Je cherche à ordonner mes résultats d'abord par années, puis par jour comme ceci :

    Annee Jour NbTrain
    --------------------------------------
    2010 lundi 253
    2010 mardi 458
    2010 mercredi 954
    2010 jeudi 686
    2010 vendredi 985
    2010 samedi 281
    2010 dimanche 53
    2011 lundi 659
    2011 mardi 567
    2011 mercredi 211
    2011 jeudi 658
    2011 vendredi 834
    2011 samedi 516
    2011 dimanche 68
    Si on considère que la colonne "numero" de ta table "periode" contient le numéro du jour (par exemple, 1 pour Lundi, 2 pour Mardi, etc.), alors il suffit de modifier le ORDER BY, comme suit :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t.annee, p.Libelle, count(t.numero) NbTrains
    FROM train t
        INNER JOIN periode p ON p.numero = t.periode
    GROUP BY p.Libelle, t.annee, p.numero
    ORDER BY t.annee ASC, p.numero ASC

  11. #11
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par coqrya Voir le message
    Bien sûr que ça marche puisque si tu regardes comment est faite ma base : "période" est le nom de la table et "samedi" est le nom de la colonne. Cette colonne étant remplie de booléens...
    Je pense que Garuda relevait une faute de syntaxe, le type boolean n'étant pas disponible sur le SQL (mais seulement sur le PL/SQL, au moins jusque la 11g). A priori la requête doit ressembler à " samedi = 'True' " ?

    Sinon à votre place je créerais une vue qui ferait une fois pour toute le pivot entre les périodes et les jours, j'imagine que ça doit revenir souvent.
    EDIT : voire mieux, modifier le modèle de données, créer une table des jours, et une table d'association entre jour et période !

  12. #12
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Je pense que Garuda relevait une faute de syntaxe, le type boolean n'étant pas disponible sur le SQL (mais seulement sur le PL/SQL, au moins jusque la 11g). A priori la requête doit ressembler à " samedi = 'True' " ?
    Absolument ! le type BOOLEEN n'existe pas en SQL Oracle !

  13. #13
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Je pense que Garuda relevait une faute de syntaxe, le type boolean n'étant pas disponible sur le SQL (mais seulement sur le PL/SQL, au moins jusque la 11g). A priori la requête doit ressembler à " samedi = 'True' " ?
    Ah d'accord. Je n'avais pas compris. Effectivement il s'agit d'une requête ultra simplifiée que je vous ai mise. En vérité nous utilisons 'Y' et 'N' pour yes et no.


    Citation Envoyé par Rei Ichido Voir le message
    Sinon à votre place je créerais une vue qui ferait une fois pour toute le pivot entre les périodes et les jours, j'imagine que ça doit revenir souvent.
    EDIT : voire mieux, modifier le modèle de données, créer une table des jours, et une table d'association entre jour et période !
    Le modèle de données est non modifiable malheureusement. Par contre je pense qu'effectivement une vue sera la bienvenue


    Citation Envoyé par DotNetMatt Voir le message
    Si on considère que la colonne "numero" de ta table "periode" contient le numéro du jour (par exemple, 1 pour Lundi, 2 pour Mardi, etc.), alors il suffit de modifier le ORDER BY, comme suit :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t.annee, p.Libelle, count(t.numero) NbTrains
    FROM train t
        INNER JOIN periode p ON p.numero = t.periode
    GROUP BY p.Libelle, t.annee, p.numero
    ORDER BY t.annee ASC, p.numero ASC
    Periode.numero n'a aucun lien avec le numéro des jours. Il s'agit juste d'un identifiant qui s'incrémente pour déterminer de quelle période il s'agit comme je l'ai montré dans cet exemple :

    Numero Libelle Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche
    -----------------------------------------------------------------
    0 "Du lun au ven" True True True True True False False
    1 "Toute la semaine" True True True True True True True
    2 "Le weekend" False False False False False True True

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

Discussions similaires

  1. Demande d'aide pour une requête avec jointure
    Par marcoxavier dans le forum Développement
    Réponses: 8
    Dernier message: 26/05/2015, 16h04
  2. Demande d'aide pour une requête
    Par jmclej dans le forum SQL
    Réponses: 6
    Dernier message: 17/11/2014, 10h53
  3. Humble demande d'aide pour une requête multi tables
    Par JayWBurn dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/06/2010, 15h27
  4. Réponses: 2
    Dernier message: 02/03/2006, 11h57
  5. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40

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