Bonjour à tous,
J'utilise DBeaver et lorsque j'exécute ce sql
J'obtiens ce résultat :
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 @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 ;
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 : 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 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) ) ;
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 ?
Partager