Bonjour,

je mets ça dans la section sql, mais c'est peut etre pas la plus appropriée.
Je suis en train de migrer une database access vers ms sql-server.
Je ne m'occupe que de la migration, je ne suis pas censé "redévelopper", c'est pour cela que dans un premier temps je ne dois pas décortiquer le code du module.
Et je n'ai malheureusement plus possibilité de contacter le developpeur

je reprends donc les requètes une à une, et je suis tombé sur un cas "bizarre" syntaxiquement parlant
La voilà telle qu'elle est sous access:
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
SELECT SECTION_ANALYTIQUE.CodeSection, 
       SECTION_ANALYTIQUE.LibelleSection, 
       FACTURE_RELEVE.NumFacture AS NoFactAvoir, 
       IIf(IsNull([MtFactReleve]),[MtTotal],[MtFactReleve]) AS Mt, 
       'Facture' AS Type, 
       '' AS LettreDef
FROM (DEMANDE_INTERIMAIRE INNER JOIN (RELEVE_HEURES INNER JOIN FACTURE_RELEVE ON 
        RELEVE_HEURES.NumReleve = FACTURE_RELEVE.NumReleve) ON 
        DEMANDE_INTERIMAIRE.NumDemandeInterim = RELEVE_HEURES.NumDemandeInterim) INNER JOIN SECTION_ANALYTIQUE ON 
        DEMANDE_INTERIMAIRE.CodeSection = SECTION_ANALYTIQUE.CodeSection
GROUP BY SECTION_ANALYTIQUE.CodeSection, 
         SECTION_ANALYTIQUE.LibelleSection, 
         FACTURE_RELEVE.NumFacture, 
         IIf(IsNull([MtFactReleve]),[MtTotal],[MtFactReleve]), 
         'Facture', 
         '', 
         DEMANDE_INTERIMAIRE.NumDemandeInterim, 
         Format(RELEVE_HEURES.DateReleve-1,'ww'), 
         Month(RELEVE_HEURES!DateReleve), 
         Year(RELEVE_HEURES!DateReleve);
Nous sommes en présence d'un group by et il n'y a pourtant aucune fonction d'agrégation plus haut...

Sans trop comprendre au début j'ai voulu la transcrire telle qu'elle en SQL-SERVER:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
SELECT     dbo.SECTION_ANALYTIQUE.CodeSection, dbo.SECTION_ANALYTIQUE.LibelleSection, dbo.FACTURE_RELEVE.NumFacture AS NoFactAvoir, 
                      CASE WHEN MtFactReleve IS NULL THEN MtTotal ELSE MtFactReleve END AS Mt, 'Facture' AS Type, '' AS LettreDef
FROM         dbo.DEMANDE_INTERIMAIRE INNER JOIN
                      dbo.RELEVE_HEURES INNER JOIN
                      dbo.FACTURE_RELEVE ON dbo.RELEVE_HEURES.NumReleve = dbo.FACTURE_RELEVE.NumReleve ON 
                      dbo.DEMANDE_INTERIMAIRE.NumDemandeInterim = dbo.RELEVE_HEURES.NumDemandeInterim INNER JOIN
                      dbo.SECTION_ANALYTIQUE ON dbo.DEMANDE_INTERIMAIRE.CodeSection = dbo.SECTION_ANALYTIQUE.CodeSection
GROUP BY dbo.SECTION_ANALYTIQUE.CodeSection, dbo.SECTION_ANALYTIQUE.LibelleSection, dbo.FACTURE_RELEVE.NumFacture, 
                      CASE WHEN MtFactReleve IS NULL THEN MtTotal ELSE MtFactReleve END, 'Facture', '', dbo.DEMANDE_INTERIMAIRE.NumDemandeInterim, 
                      dbo.F_ISO_WEEK(dbo.RELEVE_HEURES.DateReleve - 1), MONTH(dbo.RELEVE_HEURES.DateReleve), YEAR(dbo.RELEVE_HEURES.DateReleve)
(ou f_iso_week est une udf pour calculer le n° de la semaine)

J'ai le message suivant:

Chaque expression GROUP BY doit contenir au moins une colonne qui n'est pas une référence externe.
je ne le trouve pas forcément explicite !

j'ai essayé plusieurs possibilités, mettre toutes les colonnes du group by dans le select, etc, mais rien n'y fait. Message identique.

Si j'enleve le group by je passe de 4000 records à 18000
Si j'enlève le group by et que je met un distinct dans le select, je passe de 4000 records à 6000

je n'arrive pas a trouver à quoi me sert ce group by, afin de le reproduire sous sql server

vous avez une explication peut etre ??

Merci d'avance !