Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Sylvain Lafontaine
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" wrote in message 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
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" <dcorreia@mcp.fr> wrote in message
news:OlEBClfhIHA.2304@TK2MSFTNGP05.phx.gbl...
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.
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" wrote in message 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
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
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.
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.