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 :

Combiner cinq SELECT en un ?


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut Combiner cinq SELECT en un ?
    Bonjour,

    J'ai une question pour des gens calés en SQL.

    Dans une base SQLite, une table indique
    • le Code Insee du lieu de résidence
    • le Code Insee du lieu de travail
    • le mode de locomotion (1=voiture, 2=transports en commun, 3=vélo, 4=moto/scooter, 5=marche)


    Une seconde table fait le lien entre Code Insee et le nom de la ville.

    Est-il possible de remplacer ces cinq SELECT par un seul ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ;Voiture
    SELECT COUNT(*),CP_LieuTrav,LIB_LieuTrav FROM travail,cp WHERE travail.Domicile="12345" AND travail.Locomotion=1 AND travail.CP_LieuTrav=cp.CP_LieuTrav GROUP BY travail.CP_LieuTrav ORDER BY COUNT(*) DESC;
    ;TC
    SELECT COUNT(*),CP_LieuTrav,LIB_LieuTrav FROM travail,cp WHERE travail.Domicile="12345" AND travail.Locomotion=2 AND travail.CP_LieuTrav=cp.CP_LieuTrav GROUP BY travail.CP_LieuTrav ORDER BY COUNT(*) DESC;
    etc.

    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Oui tu n'as besoin que d'un select, mais dans ton code je n'en vois que 2.

    Je pense que tu as juste à changer la condition sur locomotion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND travail.Locomotion in (1, 2, 3, 4, 5)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut
    Merci.

    En fait, pour les habitants d'une commune donnée, j'ai besoin de savoir 1) dans quelles villes les gens travaillent, 2) combien y travaillent, et 3) comment les gens s'y rendent (avec le détail des parts modales, en chiffre absolu voire en pourcentage).

    Voilà ce que j'ai besoin d'obtenir :
    Nom : AF0230EF-C2CE-4A2E-8419-C12319B79012.png
Affichages : 109
Taille : 5,3 Ko

    Evidemment, je pourrais exécuter la requête cinq fois, en récupérant les données dans cinq fichiers CVS, puis copier/coller dans un tableur, mais je serais étonné qu'il ne soit pas possible de faire faire le boulot par SQL.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il nous faudrait la description des tables, un jeu de test et le résultat désiré pour pouvoir te donner une réponse précise.
    Mais en attendant tu peux faire une requête du genre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select Insee,sum(cas when Locomotion = 1 then 1 else 0 end) as voiture,sum(case when Locomotion = 2 then 1 else 0 end) as TC...
    from MaTable
    where Locomotion  in (1,2,3,4,5)
    group by INSEE
    Il ne reste plus qu'à mettre les autres SUM, ajouter les jointures idoines (ave un JOIN de préférence), les colonnes manquantes dans le SELECT et le GROUP BY.

    Tatayo.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Une solution un peu lourdingue, mais qui fonctionne

    Création du jeu d'essai :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    with TAB0(T0_user, T0_res, T0_tra, T0_loc) as
        (select 01, '12345', '12345', '1'   union all
         select 02, '12345', '12345', '1'   union all
         select 03, '12345', '12345', '2'   union all
         select 04, '12345', '12345', '2'   union all
         select 05, '12345', '12345', '2'   union all
         select 06, '12345', '12345', '4'   union all
         select 07, '12345', '12345', '4'   union all
         select 08, '12345', '22222', '1'   union all
         select 09, '12345', '22222', '1'   union all
         select 10, '12345', '22222', '1'   union all
         select 11, '12345', '22222', '4'   union all
         select 12, '12345', '22222', '4'   union all
         select 13, '12345', '33333', '3'   union all
         select 14, '12345', '33333', '5'   union all
         select 15, '12345', '33333', '5'  
         )
       , TAB1(T1_code, T1_lib) as
        (select '12345', 'glumotte les arpions'       union all
         select '22222', 'champignac en cambrousse'   union all
         select '33333', 'chichigneux'
         )
       , TAB2(T2_tra, T2_loc, T2_nbr) as
        (select T0_tra, T0_loc, count(*)
         from TAB0
         group by T0_tra, T0_loc
        )

    Requête :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    select T0_user as num_personne
         , T1_lib  as ville_travail
         , S0.nb
         , T21.T2_nbr as nb_voiture
         , T22.T2_nbr as nb_commun
         , T23.T2_nbr as nb_velo
         , T24.T2_nbr as nb_moto
         , T25.T2_nbr as nb_pieton
    from TAB0        T0
    inner join TAB1  T1
       on T1.T1_code=T0.T0_tra
    left join TAB2 T21
       on T21.T2_tra=T0.T0_tra
      and T21.T2_loc='1'
    left join TAB2 T22
       on T22.T2_tra=T0.T0_tra
      and T22.T2_loc='2'
    left join TAB2 T23
       on T23.T2_tra=T0.T0_tra
      and T23.T2_loc='3'
    left join TAB2 T24
       on T24.T2_tra=T0.T0_tra
      and T24.T2_loc='4'
    left join TAB2 T25
       on T25.T2_tra=T0.T0_tra
      and T25.T2_loc='5'
    left join
        (select T0_tra
              , count(*) as nb
         from TAB0 S0
         group by T0_tra
        ) S0
       on S0.T0_tra=T0.T0_tra

    Résultat :
    num_personne ville_travail nb nb_voiture nb_commun nb_velo nb_moto nb_pieton
    1 glumotte les arpions 7 2 3 2
    2 glumotte les arpions 7 2 3 2
    3 glumotte les arpions 7 2 3 2
    4 glumotte les arpions 7 2 3 2
    5 glumotte les arpions 7 2 3 2
    6 glumotte les arpions 7 2 3 2
    7 glumotte les arpions 7 2 3 2
    8 champignac en cambrousse 5 3 2
    9 champignac en cambrousse 5 3 2
    10 champignac en cambrousse 5 3 2
    11 champignac en cambrousse 5 3 2
    12 champignac en cambrousse 5 3 2
    13 chichigneux 3 1 2
    14 chichigneux 3 1 2
    15 chichigneux 3 1 2

    @tatayo : de ce que je comprends, il faut une totalisation pour chaque type de moyen de transport pour chaque ville, même si le compteur est à zéro.

    et pour répondre à ce besoin :

    Citation Envoyé par fredtheman Voir le message
    En fait, pour les habitants d'une commune donnée, j'ai besoin de savoir 1) dans quelles villes les gens travaillent, 2) combien y travaillent, et 3) comment les gens s'y rendent (avec le détail des parts modales, en chiffre absolu voire en pourcentage).
    il faut une ligne par personne, d'où la restitution bien lourdingue qui répète autant de fois les infos qu'il y a de personnes...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Il nous faudrait la description des tables, un jeu de test et le résultat désiré pour pouvoir te donner une réponse précise.
    Merci pour la requête.

    Exemple pour une ville donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    "Lieu_travail";"Mode_transport"
    4019;5
    6152;5
    12052;5
    13085;5
    13099;6
    https://pastebin.com/raw/A1ZdyUcS

    ---
    Edit : cette requête semble faire le job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT COUNT(CP_Lieu_travail),CP_Lieu_travail,
    sum(case when TRANS = 1 then 1 else 0 end) as marche,
    sum(case when TRANS = 2 then 1 else 0 end) as deux_roues,
    sum(case when TRANS = 3 then 1 else 0 end) as voiture,
    sum(case when TRANS = 4 then 1 else 0 end) as TC
    from matable
    where CP_Lieu_residence ="12345"
    group by CP_Lieu_travail ORDER BY COUNT(CP_Lieu_travail) DESC LIMIT 20;
    ---
    Edit : Ah non : pour une ville donnée, le COUNT de la requête renvoie au total 11707 actifs au lieu des 5854 attendus… soit 2x. Je ne voie pas d'où vient le double compte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COUNT(CP_Lieu_travail) from matable where CP_Lieu_residence ="12345";
    5854

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 123
    Points : 68
    Points
    68
    Par défaut
    C'est bon, je suis retombé sur mes pattes.

    C'était apparemment un problème de transfert d'une table à l'autre après l'import, avec un problème de conversion texte/numérique.

    Merci à tous !

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

Discussions similaires

  1. Combiner plusieurs select
    Par metaldan dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/07/2016, 04h06
  2. Recherche de type Autocomplete (JQuery ou YUI) combiné avec Select
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/04/2011, 15h51
  3. Combiner les résultats dans un select personnalisé
    Par speedev dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/05/2009, 00h14
  4. Combiner Convert et IsNull dans requete de selection
    Par calagan99 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/05/2007, 14h30
  5. Combiner un Select et un Update avec une close Union ?
    Par Cygnus Saint dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/03/2006, 18h48

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