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

Développement SQL Server Discussion :

120 Requetes SQL


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 400
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select T1, T2
    From MaTable1
    Where 
    Macondition = c1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select T1, T2
    From MaTable1
    Where 
    Macondition = c2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select T1, T2
    From MaTable1
    Where 
    Macondition = c1, c2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select T1, T2
    From MaTable1
    Where 
    Macondition = c3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select T1, T2
    From MaTable1
    Where 
    Macondition = c1, c3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select T1, T2
    From MaTable1
    Where 
    Macondition = c1, c2, c3

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 400
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par asmduty Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 400
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    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 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 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 : 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
     
    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
    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 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
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 400
    Points : 46
    Points
    46
    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 expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    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 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 asmduty Voir le message
    (Remplacer les "WHEN WHEN" par juste "WHEN")
    Mea culpa

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 400
    Points : 46
    Points
    46
    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
    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 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
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 400
    Points : 46
    Points
    46
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    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 : 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
     
    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
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    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
    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/ * * * * *

Discussions similaires

  1. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 10h31
  2. Prob de requete sql et variable
    Par agent-zaizai dans le forum ASP
    Réponses: 11
    Dernier message: 21/10/2003, 17h54
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 17h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 12h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 14h43

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