Bonjour,

je reprends actuellement le travail d'un collègue. Il s'agit de migrer une application de Sybase 6 vers Sql Server 2000. Je rencontre deux gros problèmes suite aux différences entre les possibilités du langage SQL de chacun de ses SGBD.

1. les agrégats

Une des requêtes utilise un appel imbriqué de la fonction sum. Voici la requête sous Sybase 6
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
select
AGC.codeimput as Compte,
sum((Select sum(CDL.MtTotalHT)
from ContratDecompLigne as CDL
inner join contratdecomp as CD on CD.IdContratdecomp = CDL.Idcontratdecomp and year(CD.DateFact)=2005 and Month(CD.DateFact) = 1
Where CDL.IdArticle = AGC.Idarticle
and ((AGC.Annee <> 0 and YEAR(CDL.DateDEBUT ) = AGC.Annee) or  AGC.Annee = 0)
and CD.Etat & 64 <> 0
)) as 'Janvier',
Sum((Select sum(CDL.MtTotalHT)
from ContratDecompLigne as CDL
inner join contratdecomp as CD on CD.IdContratdecomp = CDL.Idcontratdecomp and year(CD.DateFact)=2005 and Month(CD.DateFact) = 2
Where CDL.IdArticle = AGC.Idarticle
and ((AGC.Annee <> 0 and YEAR(CDL.DateDEBUT ) = AGC.Annee) or  AGC.Annee = 0)
and CD.Etat & 64 <> 0
)) as 'Février',
...
sum((Select sum(CDL.MtTotalHT)
from ContratDecompLigne as CDL
inner join contratdecomp as CD on CD.IdContratdecomp = CDL.Idcontratdecomp and year(CD.DateFact)=2005
Where CDL.IdArticle = AGC.Idarticle
and ((AGC.Annee <> 0 and YEAR(CDL.DateDEBUT ) = AGC.Annee) or  AGC.Annee = 0)
and CD.Etat & 64 <> 0
)) as 'Totaux'
 
from ArticleGestCom as AGC
Group By AGC.codeimput
Having "Totaux" <> 0
Evidemment le sum(select sum(...)) ne passe pas.

J'ai essayé de modifier la requête ainsi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
select
AGC.codeimput Compte,
(select sum(MtTotalHT) from (Select sum(CDL.MtTotalHT) MtTotalHT
from ContratDecompLigne CDL
inner join contratdecomp CD on CD.IdContratdecomp = CDL.Idcontratdecomp 
and year(CD.DateFact)=2005 and Month(CD.DateFact) = 1
Where CDL.IdArticle = AGC.Idarticle
and ((AGC.Annee <> 0 and YEAR(CDL.DateDEBUT) = AGC.Annee) or  AGC.Annee = 0)
and CD.Etat & 64 <> 0) T) 'Janvier',
...
from ArticleGestCom AGC
group By AGC.codeimput
Ca ne fonctionne toujours pas et j'ai le droit à un joli "Erreur interne SQL Server".

2. Le surnommage

De nombreuses requêtes l'utilise, avec la forme suivante par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
select chp1, chp2, (select expr1) A, (select expr2) B, (isnull(A,0)-isnull(B,0)) C, ...
where condition(A) or condition(B)
Ce qui ne passe pas non plus avec Sql Server.

Je suis actuellement bloqué sur ces 2 points. Les requêtes que je dois convertir sont assez tordues malheureusement et j'avoue que je m'y perds un peu beaucoup

Je fais donc appel à vous, surdoués du T-SQL sous Sql Server, pour m'aider à franchir ce cap, qui me semble bien difficile. Merci.