Bonjour à tous,

J'utilise DBeaver et lorsque j'exécute ce sql

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 
;
J'obtiens ce résultat :

Nom : Image 3.png
Affichages : 644
Taille : 34,6 Ko

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 :

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)
)
;
Qui me donne le bon résultat :

Nom : Image 4.png
Affichages : 610
Taille : 10,3 Ko

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 ?