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:
Nous sommes en présence d'un group by et il n'y a pourtant aucune fonction d'agrégation plus haut...
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);
Sans trop comprendre au début j'ai voulu la transcrire telle qu'elle en SQL-SERVER:
(ou f_iso_week est une udf pour calculer le n° de la semaine)
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)
J'ai le message suivant:
je ne le trouve pas forcément explicite !
Chaque expression GROUP BY doit contenir au moins une colonne qui n'est pas une référence externe.
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 !
Partager