Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/12/2010, 17h25   #1
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 28
Points : 16
Points : 16
Par défaut faire un case avec plusieurs résultats

bonjour à tous,

je cherche à faire un case dans une requête sql et affecter en fonction de la condition plusieurs résultats.

par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT CASE
  WHEN client = 'toto'
    THEN 'boite de chocolat', '10 ans'
  WHEN client = 'titi'
    THEN 'calendrier', '5 ans'
  WHEN client = 'tata'
    THEN 'stylo', '3 ans'
  END AS cadeau, anciennete
FROM table_analyse
est ce que c'est faisable d'intégrer deux résultats (cadeau ET anciennete) dans un seul case ? et si oui, quelle est la syntaxe.

je travaille sous SQL SERVER 2000.


merci pour vos réponses.



del.
delaio est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/12/2010, 11h13   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

A ma connaissance, ca n'est pas possible, il faudra faire deux CASE :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT
    CASE Client
        WHEN 'toto' THEN 'boite de chocolat'
        WHEN 'titi' THEN 'calendrier'
        WHEN 'tata' THEN 'stylo'
    END AS Cadeau,
    CASE Client
        WHEN 'toto' THEN '10 ans'
        WHEN 'titi' THEN '5 ans'
        WHEN 'tata' THEN '3 ans'
    END AS anciennete
FROM table_analyse
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 11h19   #3
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 193
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 193
Points : 743
Points : 743
Si vous atteignez un nombre important de colonnes/valeurs à renvoyer en fonction de critères identiques, il vaut alors mieux songer à l'union.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT
    'boite de chocolat' AS Cadeau,
    '10 ans' AS anciennete
FROM table_analyse
WHERE Client = 'toto'
UNION ALL
SELECT
   'calendrier' AS Cadeau,
   '5 ans' AS anciennete
FROM table_analyse
WHERE Client = 'titi'
...
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 11h22   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Re,

Il y a cependant une autre solution, en passant par une pseudo table :
Code sql :
1
2
3
4
5
6
7
8
9
 
SELECT Cadeau, Anciennete
FROM Table_analyse
INNER JOIN (
    VALUES ('toto', 'boite de chocolat', '10 ans')
        ,('titi', 'calendrier', '5ans')
        ,('tata', 'stylo', '3 ans')
) AS tmp( client, cadeau, Anciennete)
    ON tmp.client = Table_analyse.client
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 16h13   #5
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 28
Points : 16
Points : 16
je me doutais que ce n'était pas possible mais ça vaut toujours le coup de poser la question... on ne sait jamais.

merci en tout cas pour vos réponses. (à défaut, j'avais retenu la première solution du double case).

bonne semaine.



del.
delaio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 16h26   #6
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 193
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 193
Points : 743
Points : 743
Citation:
Envoyé par aieeeuuuuu Voir le message
Re,

Il y a cependant une autre solution, en passant par une pseudo table :
Code sql :
1
2
3
4
5
6
7
8
9
 
SELECT Cadeau, Anciennete
FROM Table_analyse
INNER JOIN (
    VALUES ('toto', 'boite de chocolat', '10 ans')
        ,('titi', 'calendrier', '5ans')
        ,('tata', 'stylo', '3 ans')
) AS tmp( client, cadeau, Anciennete)
    ON tmp.client = Table_analyse.client

C'est une syntaxe pour Sql server 2008, ça.
Mais sinon, c'est bien vu.
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 17h20   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par Sergejack Voir le message
C'est une syntaxe pour Sql server 2008, ça.
Mais sinon, c'est bien vu.
en effet, SQL Server n'integre pas cette fonctionnalité fort pratique depuis bien longtemps.

pour des versions anterieures, il faudra donc remplacer le VALUES par une serie de SELECT... UNION ALL, ce qui rend effectivement la solution moins simple...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h59.


 
 
 
 
Partenaires

Hébergement Web