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 28/11/2010, 19h49   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 1
Points : 1
Par défaut Requête SQL - if dans le where

Bonjour à tous,

J'ai 2 tables:
- affaire(n_affaire, date, CA, n_client)
- client(n_client, nom, prenom, adresse, telephone, type_client, client_principal)

Remarque: Pour chaque affaire, il y a obligatoirement un client principal. Dans une affaire, il est usuel de trouver plusieurs clients.


Dans une requête SQL, j'aimerai pour chaque affaire, afficher le client dont type_client='technique', et si type_client<>'technique' on affiche le client dont client_principal='oui'.

Je n'y trouve pas de solution, même en essayant CASE dans WHERE. J'utilise SQL Server, et je veux créer une vue pour un état dans CEGID.

Merci d'avance pour votre aide.
dan88 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 09h05   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
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 : 10 937
Points : 17 745
Points : 17 745
Quelque chose comme :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT ...
FROM affaire AS a
     LEFT OUTER JOIN client AS c
          ON a.n_client =
             CASE WHEN type_client =  'technique' 
                     THEN c.n_client
                  WHEN type_client <> 'technique' AND client_principal = 'oui'
                     THEN c.n_client
                  ELSE NULL
             END
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
Vieux 29/11/2010, 16h29   #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
Citation:
Envoyé par SQLpro Voir le message
Quelque chose comme :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT ...
FROM affaire AS a
     LEFT OUTER JOIN client AS c
          ON a.n_client =
             CASE WHEN type_client =  'technique' 
                     THEN c.n_client
                  WHEN type_client <> 'technique' AND client_principal = 'oui'
                     THEN c.n_client
                  ELSE NULL
             END
A +
Et sans case :

Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT ...
FROM affaire AS a
LEFT OUTER JOIN client AS c ON (
 a.n_client = c.n_client
 AND (
  type_client = 'technique'
  OR client_principal = 'oui'
 )
)
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 11h12   #4
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 1
Points : 1
Par défaut Requête SQL

Bonjour,

Merci pour vos réponses.

Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT ...
FROM affaire AS a
     LEFT OUTER JOIN client AS c
          ON a.n_client =
             CASE WHEN type_client =  'technique' 
                     THEN c.n_client
                  WHEN type_client <> 'technique' AND client_principal = 'oui'
                     THEN c.n_client
                  ELSE NULL
             END
Ce n'est pas bon car cette requête m'affiche 2 lignes lorsque j'ai un client 'technique' et un autre client 'RH' 'principal' pour la même affaire.
Or je ne veux qu'un contact par affaire.

Idem pour la requête sans CASE.

En tout cas merci pour votre aide, je vais continuer à chercher avec vos apports. Aussi merci François, je prends note.
dan88 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 11h23   #5
Membre chevronné
 
Inscription : juillet 2006
Messages : 1 193
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 1 193
Points : 743
Points : 743
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT ...
FROM affaire AS a
OUTER APPLY (
 SELECT TOP(1)
  s.*
 FROM client AS c
 WHERE a.n_client = c.n_client
 AND (
  type_client = 'technique'
  OR client_principal = 'oui'
 )
 ORDER BY CASE WHEN type_client =  'technique' THEN 1 ELSE 0 END DESC
) s
Sergejack est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 15h01   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 1
Points : 1
Par défaut Résolu

Je ne connaissais pas outer apply avant cela.

Merci beaucoup Sergejack.
dan88 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 23h27.


 
 
 
 
Partenaires

Hébergement Web