requete SQL

Le
Daniel Corréia
Bonjour,


Imaginons une requete :

SELECT * FROM (
SELECT 0 as cas,champ1,champ2
FROM

UNION

SELECT 1 as cas,champ1,champ2
FROM
) as requete
GROUP BY


qui retournerait le résultat suivant (que des numériques) :
cas champ1 champ2
0 1 10
1 1 20
0 2 10
1 3 20


je voudrais le resultat suivant :
cas champ1 champ2
1 1 20
0 2 10
1 3 20


C'est à dire pour 2 valeurs identiques de "champ1" , prendre la ligne pour
laquelle "cas" vaut 1

Je voudrais savoir s'il y a une solution en complétant la requête.

Bien sûr via un curseur il n'y a aucun probleme..


Merci d'avance
--
Daniel CORREIA
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sylvain Lafontaine
Le #11881701
Mettez tout ça dans une table temporaire et filtrer dessus. Quant à la
solution avec un curseur, cela ne sera pas si trivial que ça puisqu'à moins
d'utiliser également une table temporaire, chaque ligne retournée sera dans
son propre resultet.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: sylvain aei ca (fill the blanks, no spam please)


"Daniel Corréia" news:
Bonjour,


Imaginons une requete :

SELECT * FROM (
SELECT 0 as cas,champ1,champ2
FROM...

UNION

SELECT 1 as cas,champ1,champ2
FROM...
) as requete
GROUP BY...


qui retournerait le résultat suivant (que des numériques) :
cas champ1 champ2
0 1 10
1 1 20
0 2 10
1 3 20


je voudrais le resultat suivant :
cas champ1 champ2
1 1 20
0 2 10
1 3 20


C'est à dire pour 2 valeurs identiques de "champ1" , prendre la ligne pour
laquelle "cas" vaut 1

Je voudrais savoir s'il y a une solution en complétant la requête.

Bien sûr via un curseur il n'y a aucun probleme..


Merci d'avance
--
Daniel CORREIA




Fred BROUARD
Le #11881661
Bonjour,

tout traitement peut s'exprimer à l'aide d'une seule requête SQL depuis
la norme SQL:1999 qui permet la récursivité des requêtes, grâce à la
Common Table Expression (CTEà ou en français "expression de tables")

Avec SQL Server 2005 et en utilisant la CTE :

WITH T
AS (SELECT 0 as cas,champ1,champ2
FROM...

UNION

SELECT 1 as cas,champ1,champ2
FROM...)
SELECT DISTINCT
COALESCE(T2.cas, T1.cas) As cas,
COALESCE(T2.champ1, T1.champ1) AS champ1,
COALESCE(T2.champ2, T1.champ2) AS champ2
FROM T AS T1
LEFT OUTER JOIN T AS T2
ON T1.champ1 = T2.champ1
AND T2.cas = 1
AND T1.cas <> 1;

-- Sinon en 2000 en passant par une vue :

CREATE VIEW V
AS
SELECT 0 as cas,champ1,champ2
FROM...

UNION

SELECT 1 as cas,champ1,champ2
FROM...
;
GO

SELECT DISTINCT
COALESCE(T2.cas, T1.cas) As cas,
COALESCE(T2.champ1, T1.champ1) AS champ1,
COALESCE(T2.champ2, T1.champ2) AS champ2
FROM V AS T1
LEFT OUTER JOIN V AS T2
ON T1.champ1 = T2.champ1
AND T2.cas = 1 AND T1.cas <> 1;

-- sans vue :

SELECT DISTINCT
COALESCE(T2.cas, T1.cas) As cas,
COALESCE(T2.champ1, T1.champ1) AS champ1,
COALESCE(T2.champ2, T1.champ2) AS champ2
FROM (SELECT 0 as cas,champ1,champ2
FROM...

UNION

SELECT 1 as cas,champ1,champ2
FROM...) AS T1
LEFT OUTER JOIN (SELECT 0 as cas,champ1,champ2
FROM...

UNION

SELECT 1 as cas,champ1,champ2
FROM...) AS T2
ON T1.champ1 = T2.champ1
AND T2.cas = 1 AND T1.cas <> 1;


A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************

Daniel Corréia a écrit :
Bonjour,


Imaginons une requete :

SELECT * FROM (
SELECT 0 as cas,champ1,champ2
FROM...

UNION

SELECT 1 as cas,champ1,champ2
FROM...
) as requete
GROUP BY...


qui retournerait le résultat suivant (que des numériques) :
cas champ1 champ2
0 1 10
1 1 20
0 2 10
1 3 20


je voudrais le resultat suivant :
cas champ1 champ2
1 1 20
0 2 10
1 3 20


C'est à dire pour 2 valeurs identiques de "champ1" , prendre la ligne pour
laquelle "cas" vaut 1

Je voudrais savoir s'il y a une solution en complétant la requête.

Bien sûr via un curseur il n'y a aucun probleme..


Merci d'avance


Publicité
Poster une réponse
Anonyme