Précédent   Forum du club des développeurs et IT Pro > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 12h27   #1
kadden
Invité régulier
 
Inscription : juillet 2010
Messages : 313
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 313
Points : 8
Points : 8
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
kadden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 10h49   #2
asmduty
Membre Expert
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 778
Détails du profil
Informations personnelles :
Nom : Homme Tony
Âge : 23
Localisation : France, Mayenne (Pays de la Loire)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 778
Points : 1 285
Points : 1 285
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.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 12h44   #3
kadden
Invité régulier
 
Inscription : juillet 2010
Messages : 313
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 313
Points : 8
Points : 8
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 :
kadden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 13h08   #4
asmduty
Membre Expert
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 778
Détails du profil
Informations personnelles :
Nom : Homme Tony
Âge : 23
Localisation : France, Mayenne (Pays de la Loire)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 778
Points : 1 285
Points : 1 285
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 :

Citation:
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.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 19h06   #5
kadden
Invité régulier
 
Inscription : juillet 2010
Messages : 313
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 313
Points : 8
Points : 8
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
kadden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 20h03   #6
asmduty
Membre Expert
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 778
Détails du profil
Informations personnelles :
Nom : Homme Tony
Âge : 23
Localisation : France, Mayenne (Pays de la Loire)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 778
Points : 1 285
Points : 1 285
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.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h59   #7
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 013
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 013
Points : 1 533
Points : 1 533
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
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 10h13   #8
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 696
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 696
Points : 2 672
Points : 2 672
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.
aieeeuuuuu est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 10h43   #9
kadden
Invité régulier
 
Inscription : juillet 2010
Messages : 313
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 313
Points : 8
Points : 8
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
kadden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 10h47   #10
asmduty
Membre Expert
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 778
Détails du profil
Informations personnelles :
Nom : Homme Tony
Âge : 23
Localisation : France, Mayenne (Pays de la Loire)

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 778
Points : 1 285
Points : 1 285
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.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h19   #11
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 013
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 013
Points : 1 533
Points : 1 533
Citation:
Envoyé par asmduty Voir le message
(Remplacer les "WHEN WHEN" par juste "WHEN")
Mea culpa
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h25   #12
kadden
Invité régulier
 
Inscription : juillet 2010
Messages : 313
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 313
Points : 8
Points : 8
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.
kadden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h42   #13
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 696
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 696
Points : 2 672
Points : 2 672
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...
aieeeuuuuu est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 19h56   #14
kadden
Invité régulier
 
Inscription : juillet 2010
Messages : 313
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 313
Points : 8
Points : 8
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
kadden est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h43   #15
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 696
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 696
Points : 2 672
Points : 2 672
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
aieeeuuuuu est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/01/2013, 11h22   #16
SQLpro
Rédacteur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 12 080
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 : 12 080
Points : 21 678
Points : 21 678
À 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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h30.


 
 
 
 
Partenaires

Hébergement Web