Bonjour à tous,
Comme indiqué dans l'intitulé, j'ai un problème dans une CTE en utilisant la fonction SUM dans plusieurs champs je m'attend qu'elle me renvoi qu'un seule ligne sommée par employé tandis qu'elle me renvoi un employé dupliqué.
Voici le code de la CTE:
Voici un petit jeu de données
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 CREATE OR ALTER PROCEDURE COTISATION_MOIS ( ANNEE INTEGER, MOIS INTEGER) RETURNS ( EMPLOYE_ID INTEGER, EMPLOYE_NOM VARCHAR(30), EMPLOYE_PRENOMS VARCHAR(30), ASSIETTE NUMERIC(15,2), COTISATION NUMERIC(15,2), JOUR_TRAVAILLER FLOAT, HEURE_TRAVAILLER FLOAT ) AS BEGIN FOR WITH COTISATION (EMPLOYE_ID,ASSIETTE,COTISATION,NB_JOUR,NB_HEURE) AS ( SELECT EMPLOYE_ID,SUM(SALAIRE_COTISABLE) AS ASSIETTE,SUM(RSS) AS COTISATION, SUM(JOUR_TRAVAILLER) AS JOUR_TRAVAILLER,SUM(HEURE_TRAVAILLER) AS HEURE_TRAVAILLER FROM SALAIRES WHERE MOIS=:MOIS AND ANNEE=:ANNEE GROUP BY 1 ), SALAIRE AS ( SELECT EMPLOYE_ID,EMPLOYE_NOM,EMPLOYE_PRENOMS FROM SALAIRES WHERE MOIS=:MOIS AND ANNEE=:ANNEE ), TOTAL AS ( SELECT C.EMPLOYE_ID,S.EMPLOYE_NOM,S.EMPLOYE_PRENOMS,C.ASSIETTE,C.COTISATION,C.NB_JOUR,C.NB_HEURE FROM COTISATION C INNER JOIN SALAIRE S ON C.EMPLOYE_ID=S.EMPLOYE_ID ) SELECT EMPLOYE_ID,EMPLOYE_NOM,EMPLOYE_PRENOMS,ASSIETTE,COTISATION,NB_JOUR,NB_HEURE FROM TOTAL INTO :EMPLOYE_ID,:EMPLOYE_NOM,:EMPLOYE_PRENOMS,:ASSIETTE,:COTISATION,:JOUR_TRAVAILLER,:HEURE_TRAVAILLER DO SUSPEND; END
J'obtiens quatre lignes avec ce jeu mais si j’exécute à part le code ci-dessous en dehors de la CTE (celui de la 1ere requete du CTE: COTISATION) j'obtiens correctement les trois lignes au lieu des quatres.
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
29
30 CREATE TABLE SAL ( EMPLOYE_ID INTEGER, EMPLOYE_NOM VARCHAR(30), EMPLOYE_PRENOMS VARCHAR(30), SALAIRE_COTISABLE NUMERIC(15,2), RSS NUMERIC(15,2), JOUR_TRAVAILLER FLOAT, HEURE_TRAVAILLER FLOAT, MOIS INTEGER, TRIMESTRE INTEGER, ANNEE INTEGER) INSERT INTO SAL (EMPLOYE_ID, EMPLOYE_NOM, EMPLOYE_PRENOMS, SALAIRE_COTISABLE, RSS, JOUR_TRAVAILLER, HEURE_TRAVAILLER, MOIS, TRIMESTRE, ANNEE) VALUES (3, 'AAAA', 'BBBB', 25000, 2250, 13, 170, 12, 4, 2017); INSERT INTO SAL (EMPLOYE_ID, EMPLOYE_NOM, EMPLOYE_PRENOMS, SALAIRE_COTISABLE, RSS, JOUR_TRAVAILLER, HEURE_TRAVAILLER, MOIS, TRIMESTRE, ANNEE) VALUES (2, 'CCCC', 'DDDDD', 19000, 1710, 21, 165, 12, 4, 2017); INSERT INTO SAL (EMPLOYE_ID, EMPLOYE_NOM, EMPLOYE_PRENOMS, SALAIRE_COTISABLE, RSS, JOUR_TRAVAILLER, HEURE_TRAVAILLER, MOIS, TRIMESTRE, ANNEE) VALUES (1, 'EEEE', 'FFFF', 23500, 2115, 22, 170, 12, 4, 2017); INSERT INTO SAL (EMPLOYE_ID, EMPLOYE_NOM, EMPLOYE_PRENOMS, SALAIRE_COTISABLE, RSS, JOUR_TRAVAILLER, HEURE_TRAVAILLER, MOIS, TRIMESTRE, ANNEE) VALUES (1, 'EEEE', 'FFFF', 20000, 1800, 20, 140, 12, 4, 2017);
C'est à dire que EMPLOYE_ID n° 1 est affiché deux fois sommé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT EMPLOYE_ID,SUM(SALAIRE_COTISABLE) AS ASSIETTE,SUM(RSS) AS COTISATION, SUM(JOUR_TRAVAILLER) AS JOUR_TRAVAILLER,SUM(HEURE_TRAVAILLER) AS HEURE_TRAVAILLER FROM SALAIRES WHERE MOIS=:MOIS AND ANNEE=:ANNEE GROUP BY 1
En vous remerciant de bien vouloir m'aider.
Partager