Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Discussion: 120 Requetes SQL

  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2010
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 361
    Points : 11
    Points
    11

    Par défaut 120 Requetes SQL

    Bonjour,
    Elements de ma requête :
    1) Table : MaTable1
    2) Résultat à afficher : T1, T2
    3) Conditions : c1, c2, c3, c4, c5

    J’ai 5 conditions : c1, c2, c3, c4, c5

    Besoin :
    Je dois trouver T1, T2 selon toutes les conditions possibles (Toutes les permutations possibles entre c1,c2,c3,c4,c5) ce qui me fait 120 combinaisons possibles, y’a-t-il une meilleurs façon de faire que ça :

    Code :
    1
    2
    3
    4
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c1
    Code :
    1
    2
    3
    4
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c2
    Code :
    1
    2
    3
    4
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c1, c2
    Code :
    1
    2
    3
    4
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c3
    Code :
    1
    2
    3
    4
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c1, c3
    Code :
    1
    2
    3
    4
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c1, c2, c3

  2. #2
    Membre Expert
    Homme Profil pro Tony
    Développeur .NET
    Inscrit en
    novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Nom : Homme Tony
    Âge : 24
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2010
    Messages : 793
    Points : 1 147
    Points
    1 147

    Par défaut

    Bonjour,

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c1
    OR Macondition = c2
    OR Macondition = c3
    OR Macondition = c4
    OR Macondition = c5
    Tout simplement ?
    Le Porc est un loup pour le Porc.

  3. #3
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2010
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 361
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par asmduty Voir le message
    Bonjour,

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T1, T2
    FROM MaTable1
    WHERE 
    Macondition = c1
    OR Macondition = c2
    OR Macondition = c3
    OR Macondition = c4
    OR Macondition = c5
    Tout simplement ?
    Bien essayé mais je précise que le résultat de la requête nous fournira plusieurs lignes, exemple 20 lignes + 2 colonnes (T1, T2)

    on ne pourra pas dire quelle ligne correspond à quelle conditions :

  4. #4
    Membre Expert
    Homme Profil pro Tony
    Développeur .NET
    Inscrit en
    novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Nom : Homme Tony
    Âge : 24
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2010
    Messages : 793
    Points : 1 147
    Points
    1 147

    Par défaut

    Selon l'utilisation voulue derrière il est possible de rajouter 5 colonnes à votre requête, une par condition, qui sont cochées si la ligne remplit la condition :

    T1, T2, Cond1, Cond2, Cond3, Cond4, Cond5
    , , OUI, NON, NON, NON, NON
    , , OUI, OUI, NON, NON, NON
    , , NON, OUI, NON, NON, NON
    , , OUI, OUI, OUI, NON, NON
    etc.

    Il suffit alors dé créer les colonnes avec un CASE (je ne sais plus la syntaxe exacte mais ça doit ressembler à ça) :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT 
    T1, 
    T2, 
    Cond1 = CASE WHEN Macondition = c1 THEN 'OUI' ELSE 'NON' END, 
    Cond2 = CASE WHEN Maconditon = c2 THEN 'OUI' ELSE 'NON' END, 
    Cond3 = CASE WHEN Maconditon = c3 THEN 'OUI' ELSE 'NON' END, 
    Cond4 = CASE WHEN Maconditon = c4 THEN 'OUI' ELSE 'NON' END, 
    Cond5 = CASE WHEN Maconditon = c5 THEN 'OUI' ELSE 'NON' END
    FROM MaTable1
    WHERE 
    Macondition = c1
    OR Macondition = c2
    OR Macondition = c3
    OR Macondition = c4
    OR Macondition = c5
    Le Porc est un loup pour le Porc.

  5. #5
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2010
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 361
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par asmduty Voir le message
    Selon l'utilisation voulue derrière il est possible de rajouter 5 colonnes à votre requête, une par condition, qui sont cochées si la ligne remplit la condition :



    etc.

    Il suffit alors dé créer les colonnes avec un CASE (je ne sais plus la syntaxe exacte mais ça doit ressembler à ça) :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT 
    T1, 
    T2, 
    Cond1 = CASE WHEN Macondition = c1 THEN 'OUI' ELSE 'NON' END, 
    Cond2 = CASE WHEN Maconditon = c2 THEN 'OUI' ELSE 'NON' END, 
    Cond3 = CASE WHEN Maconditon = c3 THEN 'OUI' ELSE 'NON' END, 
    Cond4 = CASE WHEN Maconditon = c4 THEN 'OUI' ELSE 'NON' END, 
    Cond5 = CASE WHEN Maconditon = c5 THEN 'OUI' ELSE 'NON' END
    FROM MaTable1
    WHERE 
    Macondition = c1
    OR Macondition = c2
    OR Macondition = c3
    OR Macondition = c4
    OR Macondition = c5

    En faite j'ai proposé cette idée à mon Chef ... mais il m'a dit qu'il ne voulait pas s'embêter a filtrer sous Excel et à cocher/décocher les oui/non ... et il m'a même dit qu'il y'avait une méthode plus facile avec le CROSS Join ....

    Sauf qu'il ne m'a pas dit comment ? (je connais le CROSS JOIN mais je ne vois pas ce que ça va avancer de l'utiliser dans ce contexte) ?
    Merci

  6. #6
    Membre Expert
    Homme Profil pro Tony
    Développeur .NET
    Inscrit en
    novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Nom : Homme Tony
    Âge : 24
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2010
    Messages : 793
    Points : 1 147
    Points
    1 147

    Par défaut

    Je ne suis pas un expert SQL, et encore moins du Cross Join, mais cette jointure n'est pas sensée retourner le produit carthésien des tables ?

    C'est quoi le but final ?
    Ou si c'est top secret pour la Nasa, un truc qui permet d'expliquer mieux pour qu'on sache exactement ce qui est attendu.
    Le Porc est un loup pour le Porc.

  7. #7
    Membre Expert
    Inscrit en
    août 2009
    Messages
    1 046
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 046
    Points : 1 605
    Points
    1 605

    Par défaut

    Citation Envoyé par kadden Voir le message
    En faite j'ai proposé cette idée à mon Chef ... mais il m'a dit qu'il ne voulait pas s'embêter a filtrer sous Excel et à cocher/décocher les oui/non ... et il m'a même dit qu'il y'avait une méthode plus facile avec le CROSS Join ....
    Je ne vois pas de meilleure façon de faire. Et concrètement, il veut quoi ??? Parce que de toute façon il faudra bien "filtrer sous Excel" la valeur qu'il souhaite, non ? S'il souhaite n'avoir qu'une seule colonne à filtrer (genre le bosse flemmard), et qu'il n'est pas capable de faire la colonne excel supplémentaire tout seul (avec un concaténer), il suffit de le faire comme ceci :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SELECT 
    T1, 
    T2, 
      CASE WHEN WHEN Macondition = c1 THEN ' c1' ELSE '' END
    +CASE WHEN WHEN Macondition = c2 THEN ' c2' ELSE '' END
    +CASE WHEN WHEN Macondition = c3 THEN ' c3' ELSE '' END
    +CASE WHEN WHEN Macondition = c4 THEN ' c4' ELSE '' END
    +CASE WHEN WHEN Macondition = c5 THEN ' c5' ELSE '' END AS Conditions
    FROM MaTable1
    WHERE 
    Macondition = c1
    OR Macondition = c2
    OR Macondition = c3
    OR Macondition = c4
    OR Macondition = c5

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 2 912
    Points : 4 860
    Points
    4 860

    Par défaut

    Citation Envoyé par Rei Ichido Voir le message
    Et concrètement, il veut quoi ???
    C'est ça la vraie question !

    Que voulez vous faire ? précisez le besoin, et postez un jeu d'essai avec le résultat voulu. ou expliquez ce que vous voulez faire du résultat.

  9. #9
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2010
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 361
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par aieeeuuuuu Voir le message
    C'est ça la vraie question !

    Que voulez vous faire ? précisez le besoin, et postez un jeu d'essai avec le résultat voulu. ou expliquez ce que vous voulez faire du résultat.
    toute à fait je devais de vous envoyer un exemple pour voir ce qu'il souhaite vraiment (sinon je confirme oui c'est un flemmard)
    Merci de votre aide

  10. #10
    Membre Expert
    Homme Profil pro Tony
    Développeur .NET
    Inscrit en
    novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Nom : Homme Tony
    Âge : 24
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2010
    Messages : 793
    Points : 1 147
    Points
    1 147

    Par défaut

    Et bien la solution proposée par Rei Ichido est OK (Remplacer les "WHEN WHEN" par juste "WHEN"), il suffit de l'adapter à votre guise.
    Le Porc est un loup pour le Porc.

  11. #11
    Membre Expert
    Inscrit en
    août 2009
    Messages
    1 046
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 046
    Points : 1 605
    Points
    1 605

    Par défaut

    Citation Envoyé par asmduty Voir le message
    (Remplacer les "WHEN WHEN" par juste "WHEN")
    Mea culpa

  12. #12
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2010
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 361
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par asmduty Voir le message
    Et bien la solution proposée par Rei Ichido est OK (Remplacer les "WHEN WHEN" par juste "WHEN"), il suffit de l'adapter à votre guise.
    Avant de me prendre la tête à expliquer à mon responsable que son truc n'est pas faisable, j'aimerai tenter un dernier truc (ou plutôt 2 pistes) :
    - Le concept d'univers d'objet dans SQL
    - Le Datamining (qui aparrement me permettra d'avoir une restitution
    - De créer un Cube SSAS (ou un power pivot )

    Qu'en pensez-vous ? merci de votre retour.

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 2 912
    Points : 4 860
    Points
    4 860

    Par défaut

    Citation Envoyé par kadden Voir le message
    Avant de me prendre la tête à expliquer à mon responsable que son truc n'est pas faisable
    heu... Qu'est-ce que vous n'avez pas compris dans
    Citation Envoyé par asmduty Voir le message
    Et bien la solution proposée par Rei Ichido est OK (Remplacer les "WHEN WHEN" par juste "WHEN")
    Cette solution vous donne exactement ce que vous demandez, a l'exception faite de l'ordre de colonnes et des virgules pour séparer les conditions mais l'un et l'autre peuvent s'arranger !

    En fonction de ce que vous voulez en faire ensuite dans Excel (vous n'avez pas précisé), il peut être judicieux de remplacer cette chaine (C1,C2) par un masque de bits indiquant la ou les condition(s) remplie(s) pour faire du traitement ensuite, mais la requete reste à peu prés la même...

  14. #14
    Candidat au titre de Membre du Club
    Inscrit en
    juillet 2010
    Messages
    361
    Détails du profil
    Informations forums :
    Inscription : juillet 2010
    Messages : 361
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par aieeeuuuuu Voir le message
    heu... Qu'est-ce que vous n'avez pas compris dans


    Cette solution vous donne exactement ce que vous demandez, a l'exception faite de l'ordre de colonnes et des virgules pour séparer les conditions mais l'un et l'autre peuvent s'arranger !

    En fonction de ce que vous voulez en faire ensuite dans Excel (vous n'avez pas précisé), il peut être judicieux de remplacer cette chaîne (C1,C2) par un masque de bits indiquant la ou les condition(s) remplie(s) pour faire du traitement ensuite, mais la requête reste à peu prés la même...
    Non moi j'ai compris, mais j'aurai du mal à vendre cette solution à mon manager.

    Sinon je vais effectivement :
    1) Mettre C1 - C2 - C3 - C4 - C5 en colonne (dans mon Select) avec le CASE WHEN (oui si ça existe | Non quand ça n'existe pas)
    2) Stocker le résultat de ma requête : T1 - T2 - C1 - C2 - C3 - C4 - C5 dans une table temporaire "TableTempo"
    3) Lancer une deuxième requête SQL sur ma table temporaire pour trouver les combinaisons possible :
    Code :
    1
    2
    3
    4
    5
    6
    CASE 1) When C1 = oui, C2 = oui ...
    2) CASE When C1 = oui, C2 = non ...
    3) CASE When C1 = oui, C2 = oui ..., C3 = oui
    ....
     
    31)
    (il existe 31 combinaisons :



    Qu'en pensez-vous ?
    Merci

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 2 912
    Points : 4 860
    Points
    4 860

    Par défaut

    hmmm, comment dire...

    Vous pouvez peut-être expliquer à votre manager qu'il n'est pas indispensable de mettre en place des solutions dont la complexité est inversement proportionnelle à la simplicité du problème !

    bref...

    Si j'ai bien compris votre dernière réponse, vous voulez attribuer un code à chaque combinaison possible c'est bien ça ?

    Et bien c'est ce que je suggérait avec le masque de bits...
    pour synthétiser, si pour chaque combinaison on attribut 0 ou 1 selon qu'elle est vérifiée ou pas, nous obtenons donc 5 bits, et 5 bits en binaire, ça fait 32 possibilités... si on enlève le cas 00000 qui ne vous intéresse pas, on retombe bien sur vos 31 possibilités...

    si on considère C5 comme bit de poids le plus fort, et C1 comme bit de poids le plus faible, une ligne qui vérifie les combinaisons 2 et 4 vaut donc 01010 soit 10 en décimal et une ligne qui satisfait les combinaisons 1, 2 et 3 vaut 00111 soit 7 en décimal...

    Allez, on reprend la requête de Rei Ichido, en la modifiant un peu et on a:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SELECT 
    T1, 
    T2, 
      CASE WHEN Macondition = c1 THEN 1 ELSE 0 END
    +CASE WHEN Macondition = c2 THEN 2 ELSE 0 END
    +CASE WHEN Macondition = c3 THEN 4 ELSE 0 END
    +CASE WHEN Macondition = c4 THEN 8 ELSE 0 END
    +CASE WHEN Macondition = c5 THEN 16 ELSE 0 END AS Conditions
    FROM MaTable1
    WHERE 
    Macondition = c1
    OR Macondition = c2
    OR Macondition = c3
    OR Macondition = c4
    OR Macondition = c5

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 359
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric BROUARD
    Localisation : France

    Informations professionnelles :
    Activité : Expert SGBDR & SQL
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 13 359
    Points : 27 456
    Points
    27 456

    Par défaut

    À me lire : http://sqlpro.developpez.com/cours/stockageopt/

    Cela dit, n'attendez pas de performances de la part d'un tel modèle de données...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
    http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •