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

Requêtes PostgreSQL Discussion :

aide formulation requete sql


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut aide formulation requete sql
    Bonjour,

    Je possède une table dans laquelle il y a des hommes et des femmes que l'on distingue par un champ "genre".

    genre = 1 pour les hommes
    genre = 2 pour les femmes

    Ce que je demande je ne pense pas que cela soit possible mais sait-on jamais...

    J'aimerai faire une sélection de profils dans ma table mais il faudrait que le résultat me renvoie :

    un homme
    une femme
    un homme
    une femme etc....

    pensez-vous que cela soit possible ?

    Cordialement

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select 
    case 
    when genre=1 then 'un homme'
    when genre=2 then 'une femme' 
    end 
    from ...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    merci donc si je veux sélectionner l'age, la ville, la région etc... la syntaxe serait la suivante :

    SELECT age, ville, region, nom, prenom
    case
    when genre=1 then 'un homme'
    when genre=2 then 'une femme'
    end
    FROM membres


    merci

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Bon j'ai essayé mais la requête ne me renvoie pas ce que je veux. Il n'y a pas d'alternance entre homme et femme.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par viny Voir le message
    Bon j'ai essayé mais la requête ne me renvoie pas ce que je veux. Il n'y a pas d'alternance entre homme et femme.
    Essaie d'ajouter une virgule après « prenom » ...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    c'est ce que j'ai fait..;

  7. #7
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Impossible à faire en SQL avec Postgresql
    Soit tu passes par un développement PL/PgSQl, soit tu rajoutes une colonne en plus à ta table qui, en triant dessus, alterne bien un homme et une femme ...
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Tu peux me donner un peu plus d'infos sur la façon de faire ? soit en plpgsql ou autre

    Ce qui m'intéresserait aussi si alternance homme femme est compliquée à obtenir, c'est sur les X tuples renvoyés 50% soient des femmes et 50% soient des hommes

    merci pour votre aide

  9. #9
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    En gros tu as une colonne qui contient 1 ou 2, et tu veux trier pour avoir 1,2,1,2,1,2, ... c'est bien ça ?
    Il faut passer par du PL/PgSQL, par exemple :
    - faire un curseur c1 sur filtre n=1 pour n'avoir que les 1
    - faire un curseur c2 sur filtre n=2 pour n'avoir que les 2
    - créer une table temporaire qui va servir à insérer les lignes, et qui contient une colonne supplémentaire "compteur"
    - faire une boucle (while c1 non vide ou c2 non vide) avec un compteur n incrémenté qui, si ton n est pair, tu fetches 1 ligne de c1 et tu l'insères dans la table, si ton n est impair, tu fetches 1 ligne de c2 et tu l'insères dans la table avec la valeur "n" dans la colonne compteur

    Ensuite y a plus qu'à afficher la table temporaire avec "order by compteur"

    Bref il y a plusieurs solutions pour ton pb mais tout ça pour dire que tu es obligé de faire un développement spécifique
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il y a une solution relativement simple basée sur 2 séquences: une séquence pour les genre à 0, une autre pour les 1, combinées dans un même champ sur lequel tu tries.
    Il faut qu'au démarrage de la requête les séquences aient la même valeur initiale
    Exemple: mettons que la table s'appelle pers et la colonne pers.genre à 0 ou 1, plus une colonne pers.nom
    Faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TEMP SEQUENCE seq_0;
    CREATE TEMP SEQUENCE seq_1;
     
    SELECT nom,genre FROM
     (select nom,genre,
       (case when genre=0 
          then nextval('seq_0')+0.1
          else nextval('seq_1') end) as cc
         from pers) s
     ORDER BY cc;
     
    DROP SEQUENCE seq_0;
    DROP SEQUENCE seq_1;

  11. #11
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Il y a une solution relativement simple basée sur 2 séquences: une séquence pour les genre à 0, une autre pour les 1, combinées dans un même champ sur lequel tu tries.
    Il faut qu'au démarrage de la requête les séquences aient la même valeur initiale
    Exemple: mettons que la table s'appelle pers et la colonne pers.genre à 0 ou 1, plus une colonne pers.nom
    Faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TEMP SEQUENCE seq_0;
    CREATE TEMP SEQUENCE seq_1;
     
    SELECT nom,genre FROM
     (select nom,genre,
       (case when genre=0 
          then nextval('seq_0')+0.1
          else nextval('seq_1') end) as cc
         from pers) s
     ORDER BY cc;
     
    DROP SEQUENCE seq_0;
    DROP SEQUENCE seq_1;
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Impossible à faire en SQL avec Postgresql
    Parfaitement possible en SQL de base...

    Requête CHABABABADA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT T1.clef, COUNT(*) AS N, 1 AS GENRE 
    FROM membres AS T1
            INNER JOIN membres AS T2
                   ON T1.clef <= T2.clef
    GROUP BY T1.clef
    WHERE genre = 'Homme'
    UNION ALL
    SELECT T1.clef, COUNT(*) AS N, 1 AS GENRE 
    FROM membres AS T1
            INNER JOIN membres AS T2
                   ON T1.clef <= T2.clef
    GROUP BY T1.clef
    WHERE genre = 'Femme'
    ORDER BY N, GENRE
    En supposant que vous avez une colonne clef. Pas testé, car jue de données pas donné ni DDL des tables.

    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/ * * * * *

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Trop fort !

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT T1.clef, COUNT(*) AS N, 1 AS GENRE 
    FROM membres AS T1
            INNER JOIN membres AS T2
                   ON T1.clef <= T2.clef
    GROUP BY T1.clef
    WHERE genre = 'Homme'
    UNION ALL
    SELECT T1.clef, COUNT(*) AS N, 1 AS GENRE 
    FROM membres AS T1
            INNER JOIN membres AS T2
                   ON T1.clef <= T2.clef
    GROUP BY T1.clef
    WHERE genre = 'Femme'
    ORDER BY N, GENRE
    Intéressant mais même sans jeu de données si on créé la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    create table membres(clef int, genre text);
    et qu'on essaie la requête elle n'est pas valide.

    ERROR: syntax error at or near "WHERE"
    LINE 6: WHERE genre = 'Homme'

    Même en remontant le WHERE avant le GROUP BY ce qui parait être la chose à faire, on obtient:

    ERROR: column reference "genre" is ambiguous
    LINE 5: WHERE genre = 'Homme'
    ^

    C'est que genre désigne à la fois un alias de "1" mais aussi une colonne de T1 mais aussi une colonne de T2.

    Une version valide serait évidemment plus utile!

Discussions similaires

  1. Aide sur requete SQL
    Par rippoz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/07/2007, 11h46
  2. Besoin aide pour Requete SQL
    Par mystik11 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/07/2006, 11h34
  3. [OGS ?] Demande d'aide pour requete SQL
    Par hamtary dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/03/2006, 12h58
  4. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39

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