Bonjour à tous,
J'utilise DBeaver et lorsque j'exécute ce sql
J'obtiens ce résultat :Code:
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 @set deb_period = 202010 @set end_period = 202109 WITH tmp AS ( --Permet de générer une liste de mois entre les deux bornes temporelles SELECT to_char(add_months(to_date(:deb_period, 'yyyymm'), level -1), 'yyyymm') mois FROM dual CONNECT BY LEVEL <= months_between(to_date(:end_period, 'yyyymm'), to_date(:deb_period, 'yyyymm')) + 1 ) SELECT DISTINCT per.inss ,tmp.mois ,CASE fam.type WHEN 'MONO' THEN 'M' ELSE 'D' END AS typ_fam FROM beneficiaries ben LEFT JOIN lumpsum_beneficiaries lum ON lum.actor_id = ben.actor_id INNER JOIN actors ac ON ac.actor_id = ben.actor_id INNER JOIN persons per ON per.person_id = ac.person_id AND per.inss IN (00000018043) INNER JOIN historical_family_situations his_fam ON his_fam.concerned_natural_person_id = ac.person_id INNER JOIN family_situations fam ON his_fam.historical_fam_situation_id = fam.historical_fam_situation_id INNER JOIN tmp ON /*AND*/ TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(tmp.mois, 'yyyymm'), -1)),'yyyymmdd')) BETWEEN TO_NUMBER(TO_CHAR(fam.start_date,'yyyymmdd')) AND NVL(TO_NUMBER(TO_CHAR(fam.end_date,'yyyymmdd')),99991231) WHERE lum.actor_id IS NULL ORDER BY 1,2 ASC ;
Pièce jointe 608961
Ce que je souhaite faire, c'est de pivoter les données et de garder la partie variable de la période.
Voici ce que je fais avec Oracle sdl developer :
Qui me donne le bon résultat :Code:
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 column chaque_mois new_value str_in_statement select listagg(''''||mois||'''',',') within group (order by mois) as chaque_mois from ( --Permet de générer une liste de mois entre les deux bornes temporelles SELECT to_char(add_months(to_date(202010, 'yyyymm'), level -1), 'yyyymm') mois FROM dual CONNECT BY LEVEL <= months_between(to_date(202109, 'yyyymm'), to_date(202010, 'yyyymm')) + 1 ) ; WITH tmp AS ( --Permet de générer une liste de mois entre les deux bornes temporelles SELECT to_char(add_months(to_date(202010, 'yyyymm'), level -1), 'yyyymm') mois FROM dual CONNECT BY LEVEL <= months_between(to_date(202109, 'yyyymm'), to_date(202010, 'yyyymm')) + 1 ) SELECT * FROM (SELECT DISTINCT per.inss ,tmp.mois ,CASE fam.type WHEN 'MONO' THEN 'M' ELSE 'D' END AS typ_fam FROM beneficiaries ben LEFT JOIN lumpsum_beneficiaries lum ON lum.actor_id = ben.actor_id INNER JOIN actors ac ON ac.actor_id = ben.actor_id INNER JOIN persons per ON per.person_id = ac.person_id AND per.inss IN (00000018043) INNER JOIN historical_family_situations his_fam ON his_fam.concerned_natural_person_id = ac.person_id INNER JOIN family_situations fam ON his_fam.historical_fam_situation_id = fam.historical_fam_situation_id INNER JOIN tmp ON /*AND*/ TO_NUMBER(TO_CHAR(LAST_DAY(ADD_MONTHS(TO_DATE(tmp.mois, 'yyyymm'), -1)),'yyyymmdd')) BETWEEN TO_NUMBER(TO_CHAR(fam.start_date,'yyyymmdd')) AND NVL(TO_NUMBER(TO_CHAR(fam.end_date,'yyyymmdd')),99991231) WHERE lum.actor_id IS NULL ORDER BY 1,2 ASC ) PIVOT ( MAX(TYP_FAM) --FOR MOIS IN ('202010', '202109') FOR MOIS IN (&str_in_statement) ) ;
Pièce jointe 608962
Ma question : j'essaie d'adapter ce sql à DBeaver mais j'obtiens une erreur ORA-00900: invalid SQL statement. Je pense que DBeaver ne veut pas trop de Column. Pouvez-vous confirmer et si oui, existe-t-il une autre façon de faire pour obtenir le même résultat ?