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 :

Requête pour récupérer que les champs à "Vrai"


Sujet :

Langage SQL

  1. #1
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut Requête pour récupérer que les champs à "Vrai"
    Bonjour,


    J'ai une question un peu tordue : j'ai une table, disons la table "possession", avec un Id, et différents attributs, qui sont des cases vrai ou faux.

    La table se définirai donc ainsi :
    Id
    ElementA
    ElementB
    ElementC
    ElementD

    Pour chaque id, une personne a différents éléments, mais tout le monde n'a pas les mêmes. Ce qui donnerait un résultat de ce genre (en csv):
    1;Vrai;Faux;Vrai;Faux
    2;Faux;Faux;Vrai;Faux
    3;Vrai;Vrai;Vrai;Vrai


    Je voudrais un requête SQL, afin d'avoir, par ID, uniquement les éléments où c'est "Vrai".

    De ce fait, par exemple, la première requête me donnerait alors :
    1;ElementA;ElementC pour l'ID1
    1;ElementC pour l'ID2
    etc...

    Je ne peux pas faire un simple Select, car il faudrait que je fasse des "Ou" dans tous les sens, ce qui serait, en soit, faisable, mais je pense pas que ça soit la meilleure solution.

    Quelqu'un aurait une idée pour savoir comment faire une requête de ce genre ? (si mon explication est claire )


    En vous remerciant par avance de vos réponses
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 788
    Points
    30 788
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select  id
        ,   case ElementA   when 'vrai' then ';ElementA' else '' end
        ||  case ElementB   when 'vrai' then ';ElementB' else '' end
        ||  case ElementC   when 'vrai' then ';ElementC' else '' end
        ||  case ElementD   when 'vrai' then ';ElementD' else '' end
    from    matable
    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
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Votre modélisation est mauvaise, et c'est ce qui rend votre requete compliquée.

    Vous devriez avoir une table de trois colonnes : id, element, valeur

    elle contiendrait alors, pour votre exemple :
    1 A vrai
    1 B Faux
    1 C Vrai
    1 D Faux
    2 A Faux
    2 B Faux
    2 C Vrai
    ...
    
    Voire même uniquement les deux premières colonnes. elle ne contiendrait alors que les lignes pour lesquelles la valeur est vraie (à voir en fonction du besoin fonctionnel)

    Avec une pareille table, vous pourrez même ajouter un cinquième élément sans modifier la structure de la table !


    La requete deviendrait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id, Element
    FROM LaTable
    WHERE Valeur = 'Vrai'
    Qui ne retournera que les lignes à vrai

    Le mieux serait donc de revoir la modélisation. (Votre modélisation ne pourra que vous mener à des requêtes complexes et non performantes)

    En alternative, vous pouvez "simuler" cette modélisation à partir de votre modélisation actuelle grâce à une série d'UNION ALL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT id, 'A', ElementA FROM LaTable
    UNION ALL
    SELECT id, 'B', ElementB FROM LaTable
    UNION ALL
    SELECT id, 'C', ElementC FROM LaTable
    UNION ALL
    SELECT id, 'D', ElementD FROM LaTable

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Quelque chose comme ça :
    oui, aussi

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Votre modélisation est mauvaise, et c'est ce qui rend votre requete compliquée.
    Je ne suis pas d'accord. Ce qui rend la requête compliquée ce n'est pas le modèle, mais la requête elle-même SQL et la concaténation d'un nombre dynamique d'éléments mène qu'à des requêtes compliquées.

    La requête que tu proposes ne répond pas à la question. Enfin que partiellement, car il n'aura bien que les éléments 'VRAI', mais il aura une ligne par élément et par ID, alors qu'il souhaite une ligne par ID avec la concaténation des éléments.
    Sans plus d'information sur le contexte, difficile de juger de la pertinence du modèle. En tout cas, cette requête seule ne le permet pas.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    oui, c'est vrai ! al1_24 l'a d'ailleurs montré pendant que j’écrivais mon message.

    Je maintiens toutefois que la modélisation est mauvaise, et qu'elle mènera à des requêtes plus compliquée, et surtout moins performantes dans bien des cas, par exemple "quel sont les id ayant au moins un élément à vrai"

    Concernant le résultat de ma requete, elle renvoi bien les bonnes données, certes pas présentées comme voulu, mais là ce n'est plus le rôle du SGBD (même s'il existe des solutions pour ce faire).

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Je maintiens toutefois que la modélisation est mauvaise, et qu'elle mènera à des requêtes plus compliquée, et surtout moins performantes dans bien des cas, par exemple "quel sont les id ayant au moins un élément à vrai"
    Et plus performante dans d'autres, par exemple, quel sont les éléments ayant à la fois A, C et pas B D'où ma remarque sur la difficulté de juger de la pertinence du modèle sans en savoir plus sur le contexte.

    Citation Envoyé par aieeeuuuuu
    Concernant le résultat de ma requete, elle renvoi bien les bonnes données, certes pas présentées comme voulu, mais là ce n'est plus le rôle du SGBD (même s'il existe des solutions pour ce faire).
    On est d'accord. Et avec le modèle actuel, sa requête est extrêmement simple si la concaténation est faite dans une couche métier : un simple SELECT, sans jointure ! (comme quoi sa modélisation n'est pas si mal faite )
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Là encore, tu as raison !

    J'ai été péremptoire en voyant la structure de la table telle que décrite par illight, mais nul doute qu'il s'agit en fait d'une adaptation de la réalité.

    donc en effet, sans connaitre mieux le contexte, ma conclusion sur la modélisation est trop hâtive.

  9. #9
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Bonjour,


    Je suis désolé, étant beaucoup pris, j'avais oublié cette requête et que j'avais écrit ici.

    Effectivement, c'est un adaptation un peu biscornue de ce que j'ai en réalité.

    Tout d'abord, je vous remercie pour vos réponses, mais la réponse par rapport à une succession de UNION est ce que je voulais éviter.

    Je vais donc vous expliquer le contexte réel, qui vous permettra surement de comprendre mon besoin plus clairement.

    Tous les jours, je reçois des dossiers clients, que je dois envoyer. Avant de les envoyer, je dois vérifier s'il ne manque pas des pièces à mes dossiers, de façon à pouvoir les envoyer à l'organisme concerné.
    Si ces dossiers sont incomplets, je dois alors envoyer le courrier à un autre organisme, de façon à ce qu'il contacte le client, afin qu'il nous fournisse les pièces manquantes.

    Pour cela, j'ai donc une table "Dossier", où j'ai différentes informations client, avec, évidemment un ID correspondant à chaque dossier.
    Lorsque le dossier est incomplet, j'ai une table "Incomplet", qui, par ID, me permet de détailler les pièces manquantes du dossier.

    (Pour tout vous dire, je gère tout cela dans une base Access, avec des formulaires derrière. mais j'ai posé la question ici car pour moi, c'est purement un problème de requête SQL)

    Dans cette table "incomplet", j'ai donc différents attributs, qui constitue les différentes pièces du dossier, qui seraient susceptibles d'être manquantes. Donc, dans cette table, j'ai des attributs :
    ID
    Pièce A
    Pièce B
    Pièce C
    Pièce D
    etc...

    (j'en ai à peu près 15 comme ça, mais c'est un nombre fixe par contre de cases à cocher, si jamais ça peut aider...)
    Et tous ces attributs sont de type booléen, vu que derrière, je les utilise en case à cocher.

    Qui sont gérés dans un formulaire, où, lorsque le dossier est "collecté" dans ma base Access, la personne qui ajoute les informations a juste des cases à cocher pour indiquer les pièces manquantes.

    De ce fait, par la suite, j'ai un résultat tel que je vous ai énoncé au dessus, ou je n'ai pas forcément mes 15 cases qui sont cochées, mais que certaines, et ce ne sont, évidemment, pas forcément les mêmes cases pour chaque client.

    J'espère que mon besoin est plus clair maintenant

    Pour répondre, tout de même, je ne sais pas sic 'est un problème de modélisation, c'est fort probable, peut-être que j'ai mal construit mes tables au départ, mais je ne savais pas comment les construire autrement. S'il y a une solution plus simple que celle que j'ai faite, et qui serait plus facile à gérer, je suis preneur
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  10. #10
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour

    Votre modélisation est mauvaise, et c'est ce qui rend votre requete compliquée.

    Vous devriez avoir une table de trois colonnes : id, element, valeur

    elle contiendrait alors, pour votre exemple :
    1 A vrai
    1 B Faux
    1 C Vrai
    1 D Faux
    2 A Faux
    2 B Faux
    2 C Vrai
    ...
    
    Voire même uniquement les deux premières colonnes. elle ne contiendrait alors que les lignes pour lesquelles la valeur est vraie (à voir en fonction du besoin fonctionnel)

    Avec une pareille table, vous pourrez même ajouter un cinquième élément sans modifier la structure de la table !


    La requete deviendrait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id, Element
    FROM LaTable
    WHERE Valeur = 'Vrai'
    Qui ne retournera que les lignes à vrai

    Le mieux serait donc de revoir la modélisation. (Votre modélisation ne pourra que vous mener à des requêtes complexes et non performantes)

    Après mûre réflexion, et avoir relu 3 fois ce que tu as écrit, j'ai peut-être effectivement fait une erreur de modélisation, au vu du résultat que je veux obtenir.

    Il faudrait effectivement que je remodélise ma table Incomplet.

    En suivant cette logique, il faudrait que dans ma table "Incomplet" j'ai un Id pour chaque case à cocher c'est ça ? et après, faire une autre table où cet ID apparaitrait, et le résultat si c'est vrai ou faux ??
    Ou j'ai mal compris ?

    Merci pour ta réponse
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Regarde la réponse de al1_24.

    Il faudra peut-être adapter à Access, car je ne suis pas certain que ça soit supporté par Access (mais il y a à coup sûr une fonction proprio qui fait la même chose).


    En fait, pour déterminer, si la modélisation est bonne ou non, il faut avant tout se poser la question de la pertinence et de la réalité des valeurs "Vrai" et "Faux".
    En effet, ici, "vrai" et "faux" peuvent être assimilés à "non null" et "null".

    Sur un dossier, j'ai un certain nombre de pièces (avec leur ID, etc.) ou pas.

    Donc si vous stockez dans votre base le détail des pièces, alors il y a une erreur de conception : chaque pièce doit pointer sur son dossier, et c'est l'ensemble des pièces renseignées qui détermine si un dossier est complet ou non (d'autant que souvent, une pièce peut en replacer une autre : par exemple, pour une démarche administrative, si on a un passeport, on n'a pas besoin de carte d'identité, et vice versa).

    Si en revanche "l'information" que vous stockez, c'est pas les pièces justificatives, mais simplement leur présence, alors votre modélisation me semble correcte.

    Sinon, dans tous les cas, ce que vous cherchez à faire, c'est avant tout de la cosmétique : quelle que soit votre modélisation, la génération de la liste des pièces présentes (ou absentes) à partir de vos données doit se faire dans la couche applicative et non pas dans la couche SQL, qui ne sert qu'à obtenir l'information, pas à la mettre en forme.
    On ne jouit bien que de ce qu’on partage.

  12. #12
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Ok, ça me rassure pour la modélisation : c'est effectivement juste pour voir si la pièce est présente ou pas.

    Il me semble que c'est faisable dans Access, je vais voir ce que je peux faire.

    En tout cas, je remarque, finalement, que je vais être obligé de passer par une requête complexe pour faire ce que je souhaite, et donc liste finalement tous les attributs de ma table dans ma requête ça va faire un sacré paquet de lignes
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par illight Voir le message
    Ok, ça me rassure pour la modélisation : c'est effectivement juste pour voir si la pièce est présente ou pas.

    Il me semble que c'est faisable dans Access, je vais voir ce que je peux faire.

    En tout cas, je remarque, finalement, que je vais être obligé de passer par une requête complexe pour faire ce que je souhaite, et donc liste finalement tous les attributs de ma table dans ma requête ça va faire un sacré paquet de lignes
    Au risque de me répéter, vous feriez mieux de faire ce boulot dans votre application cliente, et non en SQL, qui est là pour interroger les données, et non les mettre en forme.
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/07/2012, 17h16
  2. Réponses: 2
    Dernier message: 03/11/2010, 16h18
  3. Logiciel pour récupérer que les mails dans une page web
    Par mouss4rs dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 24/07/2010, 14h41
  4. [MySQL] Requête pour récupérer toutes les valeurs d'un tableau
    Par djoumusic dans le forum PHP & Base de données
    Réponses: 40
    Dernier message: 24/08/2008, 22h11

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