---
# System prepended metadata

title: 'Validité 2021 : Diane public'

---

# Validité 2021 : Diane public
 
Passation
[ToC]

:::info
A faire (pas commencé) :   :soon:  
Commencé / en cours : :   :wrench:   
En pause / attente de ... : :construction:   
Terminé : :heavy_check_mark: 	   
Problème ::no_entry:   
:::


## Création d'un échantillon pour recette du script

:::warning
:memo: Créer un petit échantillon pour recetter le script 
- [x] En QF  :heavy_check_mark: (scripts ancienne et nouvelle ventilation lancés jusqu'au bout sur la campagne c41 Elodie)
- [ ] :question: En Prod ? :question: :construction:
:::

:clipboard: `Créer échantillon FP Diane QF pour recette du script.sql`

:::spoiler
```sql

/*********************************************************************/
/* Création d'un échantillon Fonction publique 2021 pour tester le script   */
/********************************************************************/
-- Cf. https://gitlab.insee.fr/siera/pirenees-communs/forum/-/issues/239

/*************************************************************************/
--Etape 1 : préparation des données dans ARTEMIS-CLONE
/*************************************************************************/

/* ==> Editeur sql : Clone Artemis */

-- Nombre de sirets déclarants en septembre 2021 (FP)
select  count(distinct employeur_sortie) as nbsiret_sept
from dsn_prod.clore_c74_f0n4_data 
where validite='2021-09-01'
;

select count(*) as nbobs_sept from dsn_prod.clore_c74_f0n4_data
where validite='2021-09-01';

/*
Création d'un échantillon
	- sur un mois (septembre 2021)
	- une seule "ligne" Artemis par siret * pcs_complement * pcs_complement_ese_fp * nat_contrat * statempl * statconv * unitmesureref, pour avoir une certaine diversité de contrats
*/	

drop table if exists public.eyiq15_c74_f0n4_echant;
create table public.eyiq15_c74_f0n4_echant as 
select * 
from (SELECT DISTINCT ON (employeur_sortie,pcs_complement,pcs_complement_ese_fp,nat_contrat,statempl,statconv,unitmesureref)
    *
FROM   dsn_prod.clore_c74_f0n4_data where validite='2021-09-01') as toto 
/*order by random() limit 10000*/;

select count(*) from public.eyiq15_c74_f0n4_echant;
;/*282.046 observations, pour 24.767 sirets */

SELECT pg_size_pretty( pg_total_relation_size('public.eyiq15_c74_f0n4_echant'));

/*************************************************************************/
--Etape 2 : transfert dans ARTEMIS-QF via PasPlat
/*************************************************************************/

-- Mettez votre table dans le schéma public pour être sûr de ne rien écraser.
-- Pensez à supprimer la table du clone une fois le transfert effectué.
-- Compter 1 heure de temps de transfert pour 12 Go de données (c'est déjà un bel échantillon).

/* Le Pasplat se trouve ici : X:\HAB-Siera2025\Utilitaires\passe_plat\passe_plat.bat
 * Pour pouvoir le lancer, il faut avoir au préalable : 
 * - créé un dossier "propertiesUtilitaires" dans votre disque Z: personnel
 * - créé un fichier properties.config avec le contenu suivant : 
username = xxx
password = xxx
	(idep en minuscule)
	
	Le transfert prend quelques minutes (une fenêtre de confirmation apparaît quand c'est terminé).
 */

/*************************************************************************/
-- Etape 3 : Placer les données correctement dans ARTEMIS-QF
/*************************************************************************/
/*
 
Il faut choisir un bac à sable (exemple dsn_bas8).
--> Cf l'occupation des BaS ici : https://gitlab.insee.fr/siera/pirenees-communs/forum/-/issues/257

Les données importées doivent être placées dans
dsn_bas5.clore_data

Il faut supprimer les autres données du bac à sable contenues dans les tables filles
dsn_bas5.clore_cXX_data

Rappel : la phase d'import de l'application DIANE va lire les données contenues dans la table maitre clore_data ou ses filles clore_cXX_data.
L'ouverture de DIANE a été développée pour prendre en compte ce cas (si il n'y a pas de table fille, ce sont les données de la table mère qui sont prises). Par contraposé, quand on veut que des données de la table mère soient prises, il ne faut pas qu'il y a ait des tables filles.
*/

/* ==>  Artemis QF  */

/* Je me place dans le bac à sable n°5 */

drop table if exists dsn_bas5.clore_data;
create table  dsn_bas5.clore_data as
select * from public.eyiq15_c74_f0n4_echant;

select count(*) from dsn_bas5.clore_data;

/*************************************************************************/
-- Etape 4 : Etape 4 : paramétrer votre campagne DIANE et la lancer
/*************************************************************************/
--Administration -> Gerer les campagnes
 Paramètres à renseigner : 
/*
Validité inférieure --> 2021-01-01
Validité supérieure --> 2021-12-01
décalage --> 0
Population à garder --> (typrem::text is null or typrem::text like '%REM%' or typrem::text like '%PRI%')
Environnement Artemis --> Bas5
année --> 2021
Periodicité --> M (peu importe)
n° --> 9 (peu importe)
Commentaire --> ce qu'on veut
partition --> abs(hashtext(coalesce(employeur_sortie,'')))
*/
 
 
--Puis créer un échantillon si on veut réduire la taille (ici je sélectionne 8000 nir au hasard)
--"Administration --> Tirage échantillon"
échantillon n°8 
/*
Nombre d'individus : 8000
Tirer sur le Nir : oui 
Tirer sur le Siret : non
Expression filtre : [vide]
*/

-- Affecter cet échantillon à notre campagne (cocher la case dans gestion des campagnes pour voir le tableau d'échantillonnage s'afficher).

-- Ouvrir la campagne.

Résutat (à lancer dans un Editeur branché sur Diane QF) :
/* ==> Editeur sql :Diane QF*/

select  count(*)
from diane_eyiq15.c41_e8_ouvrir_campagne_data;
;
select  count(distinct employeur_sortie)
from diane_eyiq15.c41_e8_ouvrir_campagne_data;
;
select  count(distinct personne_sortie)
from diane_eyiq15.c41_e8_ouvrir_campagne_data;
;
*/

```
:::

\
Dans le script Diane, modifier par "Remplacer tout" : 
* l'identifiant
* le numéro de la campagne 
    * associé à toutes les règles (exemple : `41::big`)
    * associé aux paramètres : `id_campagne='41'::text;`  

<br/>

>Temps de traitement de l'échantillon (8000 Nir) cf. table `pilotage_campagne` dans le schéma associé à l'idep :

| Phase | Durée | 
| -------- | -------- |
| Ouvrir     | 1 min     |
| Pré-calculs     |  2 min    |
| Conversion     |  4 min    |
| Cohérence     | 1 min     |
| Capitalisation     | 0     |
| Métier     | 2 min     |



>Tables en sortie : 
:::spoiler
```Sql
select '01-ouvrir' as table, count(*) from diane_eyiq15.c41_e8_ouvrir_campagne_data 
union
select '02-pré-calculs' as table, count(*) from diane_eyiq15.c41_e8_pre_calcul_data
union
select '03-pour gestion grade' as table, count(*) from diane_eyiq15.c41_e8_pre_calcul_produit_gestion_grade
union
select '04-doublons' as table, count(*) from diane_eyiq15.c41_e8_pre_calcul_produit_rebut_doublons
union
select '05-conversion' as table, count(*) from diane_eyiq15.c41_e8_convertir_donnees_data 
union
select '06-siret sans salaries' as table, count(*) from diane_eyiq15.c41_e8_convertir_donnees_produit_siret_sans_salarie
union
select '07-coherence' as table, count(*) from diane_eyiq15.c41_e8_calculer_salaire_prd_grappe_periode 
union
select '08-pr_tout' as table, count(*) from diane_eyiq15.c41_e8_calculer_metier_pr_tout
union
select '09-pr_CJ7' as table, count(*) from diane_eyiq15.c41_e8_calculer_metier_pr_cj7
union
select '10-pr_prive' as table, count(*) from diane_eyiq15.c41_e8_calculer_metier_pr_prive
union
select '11-pr_inx' as table, count(*) from diane_eyiq15.c41_e8_calculer_metier_pr_inx
union
select '12-pr_hv' as table, count(*) from diane_eyiq15.c41_e8_calculer_metier_pr_hv
;
```


---
## Nomenclatures grade

Les tables de nomenclatures utilisées : 

| Spécifique FP | Commun privé | 
| -------- | -------- | 
| nmcl_siasp_NEH_val2020     | nmcl_age_intervalle  
| nmcl_siasp_NET_val2020     | nmcl_ape_2008      | 
| nmcl_siasp_NNE_val2020     | nmcl_cog_2020     | 
| nmcl_art_p19v01     | nmcl_cs     | 
| nmcl_pcs_complement_ese     | nmcl_mesureactivite     | 
| karnaugh_public_2020     | nmcl_niv2     | 
|      | nmcl_tranche_effectif     | 
|{param:table_reprise_grade}     | reco_type_emploi     | 
| nmcl_pcs_2017     | reco_typecontrat_2020     | 


:bulb: *Code pour obtenir les tables externes utilisées dans un script :*
```sql
SELECT DISTINCT regexp_replace(expression,'[\r\n\t]',' ','g')::jsonb->> 'table' AS nom_table_externe
FROM diane_[idep].ihm_outil
WHERE id_campagne = '[num_campagne]'  
```

:::warning
:memo: 
Les 5 premières tables doivent être mises à jour  
:warning: **+ créer une table pour les militaires ?**  
*(Rque : la table pcs_complement_ese a été créée en dur en sql, il s'agit de quelques codes listés directement dans la norme)*  
- [x] En QF
- [x] En Prod
:::

#### Mise à jour des tables externes en QF

***Outil d'import des nomenclatures***

 :question: 


***Outil d'import de gros fichiers***
 
* Renommer tous les « code0 », « modalite », .. en « code »
* au format 
    * txt --> pas d'en-tête avec le nom des variables
    * csv --> **avec ou sans** en-tête avec le nom des variables
* convertir en UTF-8
* séparateur = ;  
* A déposer sous Applishare :   `\\horsprod.aus.applishare.insee.fr\ep_data_hp\diane_qf\fichiers-batch\DEPOT`  
 \+ fichier descripteur
    * Paramétrage dans Diane :   
        * nom du fichier : diane_nmcl.nmcl_xxxx
        * clé primaire : variable de code
        * :warning: Ensuite en sql :
            * enlever les doublons (NNE) : `distinct code, libelle `--> ca ne passera pas si on utilise la clé primaire !!   
           * ajouter une colonne d'ordre *(en theorie inutile vu qu'on utilise une jointure exacte (15), mais c'est pour être cohérents avec les autres table nmcl ?)*  
           * Ajouter une ligne balai (ordre : 999999, code : '.*', libelle = 'balai')  *en theorie inutile vu qu'on utilise une jointure exacte (15), mais nécessaire dans les règles Diane* 

> Numéro d'ordre :
```Sql
CREATE TABLE diane_nmcl.nmcl_pcs_complement_ese2  as select rank() OVER ( ORDER BY code)  as ordre, * from diane_nmcl.nmcl_pcs_complement_ese 
CREATE TABLE diane_nmcl.nmcl_art_p19v012  as select rank() OVER ( ORDER BY code)  as ordre, * from diane_nmcl.nmcl_art_p19v01
CREATE TABLE diane_nmcl.nmcl_neh_p19v012  as select rank() OVER ( ORDER BY code)  as ordre, * from diane_nmcl.nmcl_neh_p19v01 
CREATE TABLE nmcl_siasp_NET_val2020_2  as select rank() OVER ( ORDER BY code)  as ordre, * from nmcl_siasp_NET_val2020
CREATE TABLE diane_nmcl.nmcl_nne_p20v012  as select rank() OVER ( ORDER BY code)  as ordre, * from diane_nmcl.nmcl_nne_p20v01
```



 
#### Mise à jour des tables externes en Prod
 :heavy_check_mark: Exporter les tables à partir de l'IHM de QF et les importer en Prod via l'IHM:
-	Dans l’IHM de QF, aller dans administration/gérer les nomenclatures, choisir le type de table , la table et cliquer sur Télécharger la table.
-	Dézipper l’archive (au chargement, seul le format csv sera accepté …)
-	Dans l’IHM de PROD (https://diane.insee.fr/), environnement PROD, aller dans administration/gérer les nomenclatures, choisir le type de table , cliquer sur parcourir pour choisir l’emplacement du fichier et saisir le nom de la table (ou le nom qu’on veut donner) dans « Nom de la nomenclature ». Cliquer sur Transférer.

Les tables à récupérer : 
- nomenclatures (NET, NNE, NEH, PCS, ART, complement_ESE)
- karnaugh
- gestion grade à blanc (puis par la suite gestion grade effective)


  
---
## Tables de reprise grade

### Table par défaut (à blanc) 

:::warning
:memo: 
A initialiser une fois ; pas forcément amenée à changer d'une année sur l'autre.
- [x] En QF :heavy_check_mark:
- [x] En Prod :heavy_check_mark:
:::

#### En QF
 ```
 /***************************************************************************/
/* Diane
Création d'une table de reprise grade "à blanc" pour ne pas mettre le script Diane en erreur */
/***************************************************************************/


DROP TABLE IF EXISTS diane_nmcl.reco_grade_a_reintegrer_defaut_nps; 

CREATE TABLE diane_nmcl.reco_grade_a_reintegrer_defaut_nps  
(versant_fp text, siret text, libemploi text, statut_contrat_gest text,apet_ref text, apet_affectation text, nat_contrat text, statconv text, pcs text, pcs_sortie text, grade_init text, grade_gestion text, nomenc_grade_gestion text, i_grade_gestion text,pcs_grade text, origine_codage_pcsgrade text, ordre bigint)
;

INSERT INTO diane_nmcl.reco_grade_a_reintegrer_defaut_nps (versant_fp, siret, libemploi, statut_contrat_gest, apet_ref, apet_affectation,nat_contrat,
statconv, pcs, pcs_sortie, grade_init, grade_gestion, nomenc_grade_gestion, i_grade_gestion, pcs_grade, origine_codage_pcsgrade,ordre)
VALUES ('.*', '.*', '.*', '.*','.*','.*','.*', '.*', '.*', '.*','.*', NULL, NULL, NULL,NULL,NULL, 0);

 ```

#### En Prod
 
 Passer par l'**import de nomenclature** classique. (pas besoin de passer par gros fichier)
 Exporter la nomenclature reco_xxx en QF.
 L'importer en Prod (pour nommer la nomenclature, ne pas oublier "reco_").
 

### Table issue de la gestion  

 :::warning
:memo: 
- [x] En QF --> Créée directement dans la BDD Diane par le programme R d'export de la gestion grade
- [x] En Prod --> Le programme R exporte également un fichier csv ; Passer par l'import de fichiers Diane
:::

        
Pour 2021, je n'ai pas accès en écriture au dépot Applishare ...?
Je passe donc **par l'import de nomenclature classique** (ne fait pas le contrôle de l'unicité de la clé d'appariement par contre)  de type reco_ (ca passe malgré la taille importante). Il faut importer un fichier csv, comportant en 2ème ligne le type des variables (automatiquement généré par le programme R).
 
 
---
## Paramètres


:::warning
:memo: 
A mettre à jour dans le script :heavy_check_mark: 
:::

Cf. `paramètres 2020.odt` pour les valeurs.

| Spécifique FP | Commun privé | 
| -------- | -------- | 
| fp_point_indice     |  tx_crds    | 
| tx_cotisations_sociales_fonc     |  tx_csg_non_deductible    | 
| tx_cotisations_sociales_contpub     |  tx_csg    | 
|      | tx_cotisations_sociales|
| part_prime_feu     |  pass    | 
| part_prime_as     |  smic    |
| liste_feu     |  (smic_stag)    |
| table_reprise_grade     |  (dernier_jour_annee)    | 
| (seuil_trmt)      |  (dernier_vendredi_annee)    | 
|     |  table_motifin    | 



:::warning
:memo: 
A mettre à jour également dans le script  **+  :warning: dans les programmes gestion grade** :
- [ ] Codage du versant
- [ ] Codage de Statut_contrat 
- [ ] :question:  

:wrench: Fait dans le script, à faire dans les programmes grade
:::

 
---
## Prendre en compte la nouvelle norme dans le script

:::warning
:memo: 
Cf. note récapitulant les changements de la norme par rapport à N-1 (ajout de variables, ajout de modalités, modification karnaugh, ...).

:heavy_check_mark:
:::

---
## Compléter le filtre privé / public si besoin

:::warning
:memo: 
- [ ] Filtre dans l'IHM DIane pour séparer les campagnes public / privé
- [ ] variable champ_public dans le script 
- [ ] dans les programmes gestion grade ??

:soon:
:::

---
## Prendre en compte les changements côté privé

:::warning
:memo: 
Au fil de l'eau (voir avec Joan). Comparaison script privé avant/après (:bulb: Notepad ++, module `Compare`)
:::

---
## Faire un programme de contrôle des fichiers "période"

:::warning
:memo: 
A mettre en place en repartant des programmes de Joan :   
* `Micro-contrôles en direct_DIANE.sql`
* `Micro-contrôles en direct_DIANE_distrib.sql` 
* Spécificités FP : 
    * indicatrice estimation des heures
    * indicatrice nb DSN sans heures renseignées
    * indicatrices net / bruts / bascsg non renseigné
    * redressement heures supp ?
    * indicatrice grade
    * indicatrice pcsgrade
    *  :question:
* :question: Ajouts à partir de la visionneuse FP ? (des choses en périodes ?)
:::

:::warning
:memo: 
A mettre en place :  contrôle ventilation   
A minima :
   * vérifier égalité des masses entre précalculs et conversion
   * regarder la répartition des masses entre les années pour les principales variables
   * :question: répartition des périodes en fonction du remplissage net / bruts / bascsg
:::

Table pré-calculs
:::spoiler

```sql
/*************************************************************/ 
/* Masses de rémunérations                                   */
/*************************************************************/ 

-- Référence = Pré-calculs
              select  sum(coalesce(montant_rem001,0)) as somme_avant_rem001
                               , sum(coalesce(montant_rem002,0)) as somme_avant_rem002
  							   , sum(coalesce(montant_rem003,0)) as somme_avant_rem003
                               , sum(coalesce(montant_rem010,0)) as somme_avant_rem010                             
                               , sum(coalesce(montant_rem012,0)) as somme_avant_rem012 
                               , sum(coalesce(montant_rem014,0)) as somme_avant_rem014 
                               , sum(coalesce(montant_rem017,0)) as somme_avant_rem017
                               , sum(coalesce(montant_rem018,0)) as somme_avant_rem018
                               , sum(coalesce(montant_rem019,0)) as somme_avant_rem019
                               , sum(coalesce(montant_vfv,0)) as somme_avant_vfv
                               , sum(coalesce(montant_vpe,0)) as somme_avant_vpe  
                           	  , sum(coalesce(montant_bas02,0)) as somme_avant_bas02
                              , sum(coalesce(montant_bas03,0)) as somme_avant_bas03
                              , sum(coalesce(montant_bas04,0)) as somme_avant_bas04
                              , sum(coalesce(montant_bas10,0)) as somme_avant_bas10
                              , sum(coalesce(montant_bas28,0)) as somme_avant_bas28
                              , sum(coalesce(montant_bas46,0)) as somme_avant_bas46
                              , sum(coalesce(montant_bas48,0)) as somme_avant_bas48
                              , sum(coalesce(montant_bas49,0)) as somme_avant_bas49
                              , sum(coalesce(montant_pri011,0)) as somme_avant_pri011
                              , sum(coalesce(montant_pri017,0)) as somme_avant_pri017                              
                              , sum(coalesce(montant_pri034,0)) as somme_avant_pri034                              
                              , sum(coalesce(montant_pri040,0)) as somme_avant_pri040  
                              , sum(coalesce(montant_pri041,0)) as somme_avant_pri041  
                              , sum(coalesce(montant_pri043,0)) as somme_avant_pri043                              
                              , sum(coalesce(montant_pri020,0)) as somme_avant_pri020                              
                              , sum(coalesce(montant_pri026,0)) as somme_avant_pri026                              
                              , sum(coalesce(montant_pri027,0)) as somme_avant_pri027                              
                              , sum(coalesce(montant_pri903,0)) as somme_avant_pri903                              
                              , sum(coalesce(montant_arv03,0)) as somme_avant_arv03                             
                              , sum(coalesce(montant_arv17,0)) as somme_avant_arv17                              
                              , sum(coalesce(montant_arv18,0)) as somme_avant_arv18                              
                              , sum(coalesce(montant_arv31,0)) as somme_avant_arv31
                             , sum(coalesce(montant_arv11,0)) as somme_avant_arv11
                             , sum(coalesce(montant_arv92,0)) as somme_avant_arv92
                             , sum(coalesce(montant_arv93,0)) as somme_avant_arv93
                             
                from (
                select employeur_sortie, personne_sortie
                                               , montant_u * (typrem_u = 'REM001')::int as montant_rem001
                                               , montant_u * (typrem_u = 'REM002')::int as montant_rem002
                                               , montant_u * (typrem_u = 'REM003')::int as montant_rem003
                                               , montant_u * (typrem_u = 'REM010')::int as montant_rem010
                                               , montant_u * (typrem_u = 'REM012')::int as montant_rem012
                                               , montant_u * (typrem_u = 'REM014')::int as montant_rem014
                                               , montant_u * (typrem_u = 'REM017')::int as montant_rem017
                                               , montant_u * (typrem_u = 'REM018')::int as montant_rem018
                                               , montant_u * (typrem_u = 'REM019')::int as montant_rem019
                                               , montant_u * (typrem_u = 'BAS04')::int * (ind = 1)::int as montant_bas04
                                               , montant_u * (typrem_u = 'BAS10')::int * (ind = 1)::int as montant_bas10
                                               , montant_u * (typrem_u = 'BAS03')::int * (ind = 1)::int as montant_bas03
                                               , montant_u * (typrem_u = 'BAS02')::int * (ind = 1)::int as montant_bas02
                                               , montant_u * (typrem_u = 'BAS28')::int * (ind = 1)::int as montant_bas28
                                               , montant_u * (typrem_u = 'BAS46')::int * (ind = 1)::int as montant_bas46
                                               , montant_u * (typrem_u = 'BAS48')::int * (ind = 1)::int as montant_bas48
                                               , montant_u * (typrem_u = 'BAS49')::int * (ind = 1)::int as montant_bas49
                                               , montant_u * (typrem_u = 'VFV')::int * (ind = 1)::int as montant_vfv
                                               , montant_u * (typrem_u = 'VPE')::int * (ind = 1)::int as montant_vpe                                              
                                               , montant_u * (typrem_u = 'PRI011')::int  as montant_pri011
                                               , montant_u * (typrem_u = 'PRI017')::int  as montant_pri017                                             
                                               , montant_u * (typrem_u = 'PRI034')::int  as montant_pri034                                              
                                               , montant_u * (typrem_u = 'PRI040')::int  as montant_pri040
                                               , montant_u * (typrem_u = 'PRI041')::int  as montant_pri041
                                               , montant_u * (typrem_u = 'PRI043')::int  as montant_pri043                                               
                                               , montant_u * (typrem_u = 'PRI020')::int  as montant_pri020                                              
                                               , montant_u * (typrem_u = 'PRI026')::int  as montant_pri026                                                   
                                               , montant_u * (typrem_u = 'PRI027')::int  as montant_pri027
                                               , montant_u * (typrem_u = 'PRI903')::int  as montant_pri903                                               
                                               , montant_u * (typrem_u = 'ARV03')::int * (ind = 1)::int as montant_arv03                                               
                                               , montant_u * (typrem_u = 'ARV17')::int * (ind = 1)::int as montant_arv17                                              
                                                , montant_u * (typrem_u = 'ARV18')::int * (ind = 1)::int as montant_arv18                                               
                                                , montant_u * (typrem_u = 'ARV31')::int * (ind = 1)::int as montant_arv31  
                                                , montant_u * (typrem_u = 'ARV11')::int * (ind = 1)::int as montant_arv11                                                
                                                , montant_u * (typrem_u = 'ARV92')::int * (ind = 1)::int as montant_arv92 
                                                , montant_u * (typrem_u = 'ARV93')::int * (ind = 1)::int as montant_arv93 
                                               from (
                                               select employeur_sortie, personne_sortie, unnest(typrem) as typrem_u, unnest(montant)as montant_u, ind
                                               from (
                                                               select *, row_number() over(partition by employeur_sortie, substring(grprem::TEXT from 'VPE[0-9]*'), srcrem, personne_sortie, fichier_source) as ind
                                                               from diane_eyiq15.c_e0_pre_calcul_data
                                               ) a0
                )a
                ) b
;
```  
:::


\
Table conversion
:::spoiler
```sql
--ventilation APRES_VFV (conversion) : c13

select    substr(date_debut_periode_ref::text,1,4) as annee_rem,  
  sum(coalesce(montant_nbi_point_periode,0)) as fp_montant_nbi,
 sum(coalesce(fp_nbheur_redr,0)) as fp_nbheur_redr,
-- sum(coalesce(fp_alexis_nbheur_redr,0)) as fp_alexis_nbheur_redr,
 sum(coalesce(fp_heures_estimees_periode,0)) as fp_heures_estim,
 sum(coalesce(fp_alexis_heures_estimees_periode,0)) as fp_alexis_heures_estim,	  
  sum(coalesce(mesureactv_present_rem_periode,0)) as h_mesureactv,
  sum(coalesce(mesureactv_present_heure_periode,0)) as h_present_heure,
  sum(coalesce(mesureactv_present_jour_periode,0)) as h_present_jour,
  sum(coalesce(mesureactv_arret_periode,0)) as h_arret,
  sum(coalesce(nbhrsup_rem011,0)) as nbhrsup_rem011,
    sum(coalesce(nbhrsup_rem014,0)) as nbhrsup_rem014,
    sum(coalesce(nbhrsup_rem017,0)) as nbhrsup_rem017,
    sum(coalesce(nbhrsup_rem018,0)) as nbhrsup_rem018,
    sum(coalesce(nbh_rem019,0)) as nbhrsup_rem019,
	sum(montant_rem001) as rem001, 
	sum(montant_rem002) as rem002 , 
	sum(montant_rem003) as rem003, 
	sum(montant_rem010) as rem010,
	sum(montant_rem012) as rem012,	
	sum(montant_rem014) as rem014,	
	sum(montant_rem017) as rem017,
	sum(montant_rem018) as rem018,
	sum(montant_rem019) as rem019,
	sum(montant_vfv) as vfv, 	 
	sum(montant_vpe) as vpe, 
	sum(montant_bas02) as bas02, 
	sum(montant_bas03) as bas03, 
	sum(montant_bas04) as bas04, 
	sum(montant_bas10) as bas10, 
	sum(montant_bas28) as bas28, 
	sum(montant_bas46) as bas46,
	sum(montant_bas48) as bas48,
	sum(montant_bas49) as bas49,
	sum(montant_pri011) as pri011 ,	
	sum(montant_pri017) as pri017 ,	
	sum(montant_pri034) as pri034 ,
	sum(montant_pri040) as pri040 ,
	sum(montant_pri041) as pri041 ,
	sum(montant_pri043) as pri043 ,
	sum(montant_pri020) as pri020 ,	
	sum(montant_pri026) as pri026,	
	sum(montant_pri027) as pri027 ,
	sum(montant_pri903) as pri903 ,
	sum(montant_arv03) as arv03 ,		
	sum(montant_arv17) as arv17 ,	
	sum(montant_arv18) as arv18 ,	
	sum(montant_arv31) as arv31 ,
	sum(montant_arv11) as arv11 /*,	
	sum(montant_arv92) as arv92 ,	
	sum(montant_arv93) as arv93 */	
from diane_eyiq15.c14_e0_convertir_donnees_data
group by substr(date_debut_periode_ref::text,1,4)  
;
```  
:::

\
Comparaison pré-calculs vs Conversion (si masses totales différentes)
:::spoiler
```sql
/*************************************************************/ 
/* Comparaison poste par poste (Précalculs vs Conversion)    */
/*************************************************************/ 
              
drop table if exists compar_ouvr ;
create temporary table compar_ouvr as
select *
from (
                select    employeur_sortie_periode, personne_sortie_periode
                               ,sum(coalesce(montant_rem001,0)) as somme_apres_rem001
                               , sum(coalesce(montant_rem002,0)) as somme_apres_rem002
  							   , sum(coalesce(montant_rem003,0)) as somme_apres_rem003
                               , sum(coalesce(montant_rem010,0)) as somme_apres_rem010                             
                               , sum(coalesce(montant_rem019,0)) as somme_apres_rem019  
                               , sum(coalesce(montant_vfv,0)) as somme_apres_vfv
                               , sum(coalesce(montant_vpe,0)) as somme_apres_vpe  
                              , sum(coalesce(montant_bas02,0)) as somme_apres_bas02
                              , sum(coalesce(montant_bas03,0)) as somme_apres_bas03
                              , sum(coalesce(montant_bas04,0)) as somme_apres_bas04
                              , sum(coalesce(montant_bas10,0)) as somme_apres_bas10
                              , sum(coalesce(montant_bas28,0)) as somme_apres_bas28
                              , sum(coalesce(montant_pri011,0)) as somme_apres_pri011
                              , sum(coalesce(montant_pri017,0)) as somme_apres_pri017                              
                              , sum(coalesce(montant_pri034,0)) as somme_apres_pri034                              
                             , sum(coalesce(montant_pri043,0)) as somme_apres_pri043                              
                              , sum(coalesce(montant_pri020,0)) as somme_apres_pri020                              
                              , sum(coalesce(montant_pri026,0)) as somme_apres_pri026                              
                              , sum(coalesce(montant_pri027,0)) as somme_apres_pri027                              
                              , sum(coalesce(montant_pri903,0)) as somme_apres_pri903                              
                              , sum(coalesce(montant_arv03,0)) as somme_apres_arv03                             
                              , sum(coalesce(montant_arv17,0)) as somme_apres_arv17                              
                              , sum(coalesce(montant_arv18,0)) as somme_apres_arv18                              
                              , sum(coalesce(montant_arv31,0)) as somme_apres_arv31                              
                            
                from diane_eyiq15.c33_e0_convertir_donnees_data 
                group by employeur_sortie_periode, personne_sortie_periode
) taba
left join (
                select    employeur_sortie, personne_sortie
                               , sum(coalesce(montant_rem001,0)) as somme_avant_rem001
                               , sum(coalesce(montant_rem002,0)) as somme_avant_rem002
  							   , sum(coalesce(montant_rem003,0)) as somme_avant_rem003
                               , sum(coalesce(montant_rem010,0)) as somme_avant_rem010                             
                               , sum(coalesce(montant_rem019,0)) as somme_avant_rem019
                               , sum(coalesce(montant_vfv,0)) as somme_avant_vfv
                               , sum(coalesce(montant_vpe,0)) as somme_avant_vpe  
                           	  , sum(coalesce(montant_bas02,0)) as somme_avant_bas02
                              , sum(coalesce(montant_bas03,0)) as somme_avant_bas03
                              , sum(coalesce(montant_bas04,0)) as somme_avant_bas04
                              , sum(coalesce(montant_bas10,0)) as somme_avant_bas10
                              , sum(coalesce(montant_bas28,0)) as somme_avant_bas28
                              , sum(coalesce(montant_pri011,0)) as somme_avant_pri011
                              , sum(coalesce(montant_pri017,0)) as somme_avant_pri017                              
                              , sum(coalesce(montant_pri034,0)) as somme_avant_pri034                              
                              , sum(coalesce(montant_pri043,0)) as somme_avant_pri043                              
                              , sum(coalesce(montant_pri020,0)) as somme_avant_pri020                              
                              , sum(coalesce(montant_pri026,0)) as somme_avant_pri026                              
                              , sum(coalesce(montant_pri027,0)) as somme_avant_pri027                              
                              , sum(coalesce(montant_pri903,0)) as somme_avant_pri903                              
                              , sum(coalesce(montant_arv03,0)) as somme_avant_arv03                             
                              , sum(coalesce(montant_arv17,0)) as somme_avant_arv17                              
                              , sum(coalesce(montant_arv18,0)) as somme_avant_arv18                              
                              , sum(coalesce(montant_arv31,0)) as somme_avant_arv31                                      
                from (
                select employeur_sortie, personne_sortie
                                               , montant_u * (typrem_u = 'REM001')::int as montant_rem001
                                               , montant_u * (typrem_u = 'REM002')::int as montant_rem002
                                               , montant_u * (typrem_u = 'REM003')::int as montant_rem003
                                               , montant_u * (typrem_u = 'REM010')::int as montant_rem010
                                               , montant_u * (typrem_u = 'REM019')::int as montant_rem019
                                               , montant_u * (typrem_u = 'BAS04')::int * (ind = 1)::int as montant_bas04
                                               , montant_u * (typrem_u = 'BAS10')::int * (ind = 1)::int as montant_bas10
                                               , montant_u * (typrem_u = 'BAS03')::int * (ind = 1)::int as montant_bas03
                                               , montant_u * (typrem_u = 'BAS02')::int * (ind = 1)::int as montant_bas02
                                               , montant_u * (typrem_u = 'BAS28')::int * (ind = 1)::int as montant_bas28
                                               , montant_u * (typrem_u = 'VFV')::int * (ind = 1)::int as montant_vfv
                                               , montant_u * (typrem_u = 'VPE')::int * (ind = 1)::int as montant_vpe                                              
                                               , montant_u * (typrem_u = 'PRI011')::int  as montant_pri011
                                               , montant_u * (typrem_u = 'PRI017')::int  as montant_pri017                                               
                                               , montant_u * (typrem_u = 'PRI034')::int  as montant_pri034                                               
                                               , montant_u * (typrem_u = 'PRI043')::int  as montant_pri043                                               
                                               , montant_u * (typrem_u = 'PRI020')::int  as montant_pri020                                               
                                               , montant_u * (typrem_u = 'PRI026')::int  as montant_pri026                                                   
                                               , montant_u * (typrem_u = 'PRI027')::int  as montant_pri027
                                               , montant_u * (typrem_u = 'PRI903')::int  as montant_pri903                                               
                                               , montant_u * (typrem_u = 'ARV03')::int * (ind = 1)::int as montant_arv03                                               
                                               , montant_u * (typrem_u = 'ARV17')::int * (ind = 1)::int as montant_arv17                                              
                                                , montant_u * (typrem_u = 'ARV18')::int * (ind = 1)::int as montant_arv18                                               
                                                , montant_u * (typrem_u = 'ARV31')::int * (ind = 1)::int as montant_arv31                                               

                from (
                                               select employeur_sortie, personne_sortie, unnest(typrem) as typrem_u, unnest(montant)as montant_u, ind
                                               from (
                                                               select *, row_number() over(partition by employeur_sortie, substring(grprem::TEXT from 'VPE[0-9]*'), srcrem, personne_sortie, fichier_source) as ind
                                                               from diane_eyiq15.c33_e0_pre_calcul_data
                                               ) a0
                )a
                ) b
                group by employeur_sortie, personne_sortie
) tabb
on taba.employeur_sortie_periode = tabb.employeur_sortie
and taba.personne_sortie_periode = tabb.personne_sortie
;
select * from compar_ouvr where abs(somme_apres_rem001 - somme_avant_rem001)>1
```  
:::

\
Comparaison poste par poste (entre 2 campagnes) en tenant compte de l'ANNEE
:::spoiler
```sql=
/* Comparaison poste par poste (entre 2 campagnes) en tenant compte de l'ANNEE */

drop table if exists compar_camp13_an ;
create temporary table compar_camp13_an as
select *
from (
                select    substr(date_debut_periode_ref::text,1,4) as apres_annee_rem, 
                			employeur_sortie_periode, personne_sortie_periode,
 		 sum(coalesce(fp_nbheur_redr,0)) as fp_apres_nbheur_redr,
 	/*	 sum(coalesce(fp_alexis_nbheur_redr,0)) as fp_alexis_apres_nbheur_redr,*/
 		 sum(coalesce(fp_heures_estimees_periode,0)) as fp_apres_heures_estim
 	/*	 sum(coalesce(fp_alexis_heures_estimees_periode,0)) as fp_alexis_apres_heures_estim	*/
                			, sum(coalesce(mesureactv_present_rem_periode,0)) as somme_apres_mesureactv
                               , sum(coalesce(montant_rem001,0)) as somme_apres_rem001
                               , sum(coalesce(montant_rem002,0)) as somme_apres_rem002
                               , sum(coalesce(montant_rem003,0)) as somme_apres_rem003
                               , sum(coalesce(montant_rem019,0)) as somme_apres_rem019
                               , sum(coalesce(montant_rem018,0)) as somme_apres_rem018
                               , sum(coalesce(montant_rem017,0)) as somme_apres_rem017
                               , sum(coalesce(nbhrsup_rem017,0)) as apres_nbhrsup_rem017
                               , sum(coalesce(montant_vfv,0)) as somme_apres_vfv
                               , sum(coalesce(montant_vpe,0)) as somme_apres_vpe  
                              , sum(coalesce(montant_bas02,0)) as somme_apres_bas02
                              , sum(coalesce(montant_bas03,0)) as somme_apres_bas03
                              , sum(coalesce(montant_bas04,0)) as somme_apres_bas04
               from diane_eyiq15.c13_e0_convertir_donnees_data 
                group by employeur_sortie_periode, personne_sortie_periode, substr(date_debut_periode_ref::text,1,4)
                ) taba
left join 
(
                select    substr(date_debut_periode_ref::text,1,4) as avant_annee_rem, 
                		employeur_sortie_periode as employeur_sortie , personne_sortie_periode as personne_sortie,
 		 sum(coalesce(fp_nbheur_redr,0)) as fp_avant_nbheur_redr,
 	/*	 sum(coalesce(fp_alexis_nbheur_redr,0)) as fp_alexis_avant_nbheur_redr,*/
 		 sum(coalesce(fp_heures_estimees_periode,0)) as fp_avant_heures_estim,
 	/*	 sum(coalesce(fp_alexis_heures_estimees_periode,0)) as fp_alexis_avant_heures_estim,	 */
 		 sum(coalesce(mesureactv_present_rem_periode,0)) as somme_avant_mesureactv
                               , sum(coalesce(montant_rem001,0)) as somme_avant_rem001
                               , sum(coalesce(montant_rem002,0)) as somme_avant_rem002
                               , sum(coalesce(montant_rem003,0)) as somme_avant_rem003
                               , sum(coalesce(montant_rem019,0)) as somme_avant_rem019
                               , sum(coalesce(montant_rem018,0)) as somme_avant_rem018
                               , sum(coalesce(montant_rem017,0)) as somme_avant_rem017
                               , sum(coalesce(nbhrsup_rem017,0)) as avant_nbhrsup_rem017
                               , sum(coalesce(montant_vfv,0)) as somme_avant_vfv
                               , sum(coalesce(montant_vpe,0)) as somme_avant_vpe  
                              , sum(coalesce(montant_bas02,0)) as somme_avant_bas02
                              , sum(coalesce(montant_bas03,0)) as somme_avant_bas03
                              , sum(coalesce(montant_bas04,0)) as somme_avant_bas04
               from diane_eyiq15.c18_e0_convertir_donnees_data a
               /* where exists (select 1 from diane_eyiq15.c33_e0_convertir_donnees_data b where a.personne_sortie_periode=b.personne_sortie_periode and a.employeur_sortie_periode=b.employeur_sortie_periode)*/
                group by employeur_sortie_periode, personne_sortie_periode, substr(date_debut_periode_ref::text,1,4)
)  tabb
on taba.employeur_sortie_periode = tabb.employeur_sortie
and taba.personne_sortie_periode = tabb.personne_sortie
and taba.apres_annee_rem = tabb.avant_annee_rem
;

select * from compar_camp13_an where apres_annee_rem='2020' and abs(somme_apres_bas04 - somme_avant_bas04) > 1 ;

select * from compar_camp33_an where apres_annee_rem='2020' and abs(fp_apres_nbheur_redr - fp_avant_nbheur_redr) > 1 and fp_apres_heures_estim =fp_avant_heures_estim

```
:::


\
Exemples pour comprendre la déclaration, la ventilation, l'agrégation

```sql
/*************************************************************/ 
/* Exemples pour comprendre                                  */
/*************************************************************/ 
-- Déclaration : contrat : 
select personne_sortie,employeur_sortie, fichier_source, id_row, srcrem, unnest(typrem) as typrem_u, 
  unnest(montant)as montant_u, unnest(date_debut_rem) as debut_rem, unnest(date_fin_rem) as fin_rem, unnest(mesureactv) as mesureactv_uf, unnest(nbhrsup) as nbhrsup , txtempspartiel_fp, quotite, quotite_ref, nat_poste_fp, nbi_fp
from diane_eyiq15.c13_e0_pre_calcul_data
where personne_sortie='1720864102025'
order by srcrem, id_row,debut_rem ,typrem_u
;

-- Conversion : 
select  personne_sortie_periode as personne_sortie, 
	employeur_sortie_periode as employeur_sortie, 
	date_debut_periode_ref::text,
	date_fin_periode_ref::text,
	mesureactv_present_rem_periode,  
	montant_rem002 , montant_rem001,montant_rem003,montant_rem010,montant_rem012,montant_rem017,montant_rem018,montant_vfv,montant_vpe,montant_bas02,montant_bas03,montant_bas04,
	montant_bas10,montant_bas28,montant_bas29,
	montant_pri011, montant_pri027, montant_pri034, montant_pri028,   
	montant_arv03 , montant_arv07, montant_arv09,montant_arv17 ,montant_arv18,montant_arv11, montant_arv31,montant_pri027,
	mesureactv_present_heure_periode, mesureactv_present_jour_periode,mesureactv_arret_periode, nbhrsup_rem017, nbhrsup_rem017_r, fp_quo_siasp_periode, fp_heures_estimees_periode, fp_nbheur_redr, quotite_periode, quotite_ref_periode, ind_heures_non_decl_periode/*, unit_non_conv_periode*/
from diane_eyiq15.c9_e0_convertir_donnees_data
where personne_sortie_periode ='1720864102025'
order by date_debut_periode_ref;

```



---
---
---


# :information_source: Quelques codes SQL pour manipulation dans la BDD 

:::info
**A lancer avant de travailler sur un clone**
:::
```sql
set enable_mergejoin=off; set enable_material=off; set enable_seqscan=off; set enable_nestloop=off; set enable_bitmapscan=on;
	set work_mem="16MB";
	set maintenance_work_mem="16MB";
	SELECT timeofday() into debut;
```


:::info
**Savoir quelle requête est en train de tourner en temps réel**
:::
```sql
SELECT usename, query, query_start, state_change, wait_event_type, wait_event 
 FROM get_sa() 
 -- WHERE usename = 'user_artmida' */
 ;
 ```
 :::info
**Longueur d'un vecteur**
:::
```sql
SELECT typrem, tx_remun_fp
, array_length(typrem,1) AS lg1
, array_length(tx_remun_fp,1) AS lg2 
FROM diane_eyiq15.c124_e22_pre_calcul_data
WHERE array_length(typrem,1)= array_length(tx_remun_fp,1)
;
```


:::info
**Modifier des valeurs dans une table**
:::
```sql
-- On ne met à jour que les éléments dont la CJ est NULL. Attention clé de jointure (siret X validite)
UPDATE diane_eyiq15.c132_e0_ouvrir_campagne_data foo
SET cj = bar.categoriejuridiqueunitelegale
FROM public.apisirene_c1_data bar
WHERE foo.cj IS NULL AND foo.employeur_sortie = bar.siret AND foo.validite::text = bar.validite::text
;
```

:::info
**Diane : taille des schémas et des tables**
:::
:::spoiler
```sql
SELECT pg_size_pretty(pg_database_size('ri_pg_diane_qf03'));

-- Par schéma : 
SELECT schemaname
, sum(size_brute) as size_brute
, pg_size_pretty(sum(size_brute)) as size
FROM
(
SELECT schemaname, relname
, pg_total_relation_size(schemaname||'.'||relname) as size_brute
FROM pg_stat_user_tables 
where (schemaname ~ '^diane' or schemaname in ('heritage', 'public'))
	and not relname ~ '^sauv' 
) foo
group by schemaname
order by size_brute desc
;

-- Analyse du schéma heritage par table
SELECT table_maitre
, pg_size_pretty(sum(size_brute)) AS size
, sum(size_brute) as size_brute
FROM
(
SELECT relname
, n_live_tup
, pg_total_relation_size(schemaname||'.'||relname) AS size_brute
, CASE WHEN schemaname = 'heritage' THEN regexp_replace(relname, '\$[0-9]{4}$', '') ELSE relname END AS table_maitre

FROM pg_stat_user_tables 
where schemaname = 'heritage' 
) foo
GROUP BY table_maitre
ORDER BY size_brute DESC
;
-- analyse par campagne du schéma heritage
SELECT campagne
, pg_size_pretty(sum(size_brute)) AS size
, sum(size_brute) as size_brute
FROM
(
SELECT relname
, n_live_tup
, pg_total_relation_size(schemaname||'.'||relname) AS size_brute
, regexp_replace(relname, '_.*', '') AS campagne

FROM pg_stat_user_tables 
where schemaname = 'heritage' 
) foo
GROUP BY campagne
ORDER BY size_brute DESC
;

-- Nombre de ligne de la campagne c13
SELECT table_maitre
, pg_size_pretty(sum(size_brute)) AS size
, sum(size_brute) as size_brute
, sum(n_live_tup) as n_live_tup
FROM
(
SELECT relname
, n_live_tup
, pg_total_relation_size(schemaname||'.'||relname) AS size_brute
, CASE WHEN schemaname = 'heritage' THEN regexp_replace(relname, '\$[0-9]{4}$', '') ELSE relname END AS table_maitre

FROM pg_stat_user_tables 
where schemaname = 'heritage' and relname ~'c13' 
) foo
GROUP BY table_maitre
ORDER BY size_brute DESC
;
```
:::

\
:::info
**Créer un échantillon dans Diane "bouchonné"**
:::
Il faut que la campagne ait déjà été ouverte, pour que les tables de gestion de la campagne soient à peu près à jour.  
Faire un retour arrière sur pré-calculs.   
Ecraser la table d'ouverture de campagne :
```sql
DROP TABLE IF EXISTS diane_eyiq15.c13_e0_ouvrir_campagne_data CASCADE;
CREATE TABLE diane_eyiq15.c13_e0_ouvrir_campagne_data AS
SELECT * FROM diane_eyiq15.c9_e0_ouvrir_campagne_data;
--where personne_sortie in ('1530575017083') ;
```

:::info
**Vérifier / corriger le "id_hash"**
:::
En cas de "bouchonnage", le nombre d'id_hash (nombre de partitions) est souvent trop élevé par rapport au nombre de lignes de la table ; cela peut créer des lenteurs importantes du moteur générique. Il faut donc reclculer l'id_hash adapté à la taille de léchantillon (1 pour un petit nombre de lignes, sinon à calculer avec la procédure ci-dessous).


**Quel est le id_hash actuel ?**
:::spoiler
```sql
SELECT 
count(1) AS nb_row, 
max(id_hash)
FROM diane_eyiq15.c13_e0_pre_calcul_data ;
```
:::

\
**Quel id_hash souhaitable ?**
:::spoiler
```sql
WITH tmp_count AS (
SELECT (count(*)*10000) + 1 AS n
FROM diane_eyiq15.c9_e0_ouvrir_campagne_data tablesample system(0.01)
)
SELECT CASE WHEN log(n) <= 5 THEN 2
WHEN log(n) <= 6 THEN 8
WHEN log(n) <= 7 THEN 64
ELSE 1024
END AS n
FROM tmp_count
;
```
:::  

\
**Forcer le id_hash à 1**
:::spoiler
```sql
DROP TABLE IF EXISTS public.eyiq15;
CREATE TABLE public.eyiq15
AS
SELECT * FROM diane_eyiq15.c38_e0_ouvrir_campagne_data
;
    -- DROP id_hash
ALTER TABLE public.eyiq15 DROP COLUMN id_hash;

DROP TABLE IF EXISTS public.eyiq15_propre;
CREATE TABLE public.eyiq15_propre
AS
SELECT *
, 1 AS id_hash
FROM public.eyiq15
;

DROP TABLE IF EXISTS diane_eyiq15.c38_e0_ouvrir_campagne_data CASCADE;
CREATE TABLE diane_eyiq15.c38_e0_ouvrir_campagne_data
AS
SELECT * FROM public.eyiq15_propre
;
```
:::

\
**Forcer le id_hash à ? (ici : 8)** (:bulb:si id_hash théorique >64, forcer à 64, sinon c'est trop long)
:::spoiler
```sql
DROP TABLE IF EXISTS public.eyiq15;
CREATE TABLE public.eyiq15
AS
SELECT * FROM diane_eyiq15.c38_e0_ouvrir_campagne_data
;
-- DROP id_hash
ALTER TABLE public.eyiq15 DROP COLUMN id_hash;

-- Recalcul de id_hash
DROP TABLE IF EXISTS public.eyiq15_propre;
CREATE TABLE public.eyiq15_propre
AS
SELECT *
, abs(hashtext(coalesce(employeur_sortie,'')))% 8 + 1 AS id_hash
FROM public.eyiq15
;

-- Remplacement de l'ancienne table avec les bonnes données
DROP TABLE IF EXISTS diane_eyiq15.c32_e0_ouvrir_campagne_data CASCADE;
CREATE TABLE diane_eyiq15.c32_e0_ouvrir_campagne_data
AS
SELECT * FROM public.eyiq15_propre
;
```
:::  

\

:::info
**Recherche d'un  libellé**
:::
```sql
select * from diane_eyiq15.c3_e1_calculer_salaire_produit_grappe_periode
where libelle_emploi_periode like '%MOULEUR UP1%'; 
```



:question::question: :question:
:x:

/*************************************************************/ 
/* Nb lignes                                                 */
/*************************************************************/ 

  select count (*),validite from diane_eyiq15.c8_e0_ouvrir_campagne_data group by validite  ;
  select count (*),validite from diane_eyiq15.c18_e0_ouvrir_campagne_data group by validite  ;
  select count (*),validite from diane_eyiq15.c13_e0_ouvrir_campagne_data group by validite  ;
  
  select count (*),validite from diane_eyiq15.c9_e0_pre_calcul_data group by validite  ;/*   */
  select count (*),validite from diane_eyiq15.c18_e0_pre_calcul_data group by validite  ;/*   */
  select count (*),validite from diane_eyiq15.c13_e0_pre_calcul_data group by validite  ;/*   */
  
  select count (*) from diane_eyiq15.c9_e0_convertir_donnees_data  ; /*  */
  select count (*) from diane_eyiq15.c18_e0_convertir_donnees_data  ; /*  */
  select count (*) from diane_eyiq15.c33_e0_convertir_donnees_data  ; 

  select count (*) from diane_eyiq15.c9_e0_calculer_metier_pr_cj7  ; /*   */
  select count (*) from diane_eyiq15.c18_e0_calculer_metier_pr_cj7  ; /*   */
  select count (*) from diane_eyiq15.c13_e0_calculer_metier_pr_cj7  ; 

   select count (*) from diane_eyiq15.c9_e0_calculer_metier_pr_inx  ; /*   */
  select count (*) from diane_eyiq15.c18_e0_calculer_metier_pr_hv  ; /*   */
  select count (*) from diane_eyiq15.c13_e0_calculer_metier_pr_hv  ; 
 
   select * from   diane_eyiq15.c13_e0_calculer_metier_pr_hv  limit 10  ; 
  
  select count (*) from diane_eyiq15.c26_e0_convertir_donnees_data  ; /*  */
  select count (*) from diane_eyiq15.c32_e0_convertir_donnees_data  ; /*  */
  select count (*) from diane_eyiq15.c33_e0_convertir_donnees_data  ; 
/*************************************************************/ 
/* Nb periodes par années                                    */
/*************************************************************/ 

-- périodes agrégées
select substr(date_fin_periode_ref::text,1,4), count(*) 
from diane_eyiq15.c9_e0_convertir_donnees_data
group by substr(date_fin_periode_ref::text,1,4)
;
select substr(date_fin_periode_ref::text,1,4),  count(*) 
from diane_eyiq15.c18_e0_convertir_donnees_data
group by substr(date_fin_periode_ref::text,1,4)
;

select substr(date_fin_periode_ref::text,1,4),  count(*) 
from diane_eyiq15.c13_e0_convertir_donnees_data
group by substr(date_fin_periode_ref::text,1,4)
;

/* Nb périodes*/
 select  count(*) as nb_periodes
from diane_eyiq15.c14_e0_calculer_metier_pr_cj7
;

/* Nb Nir*/
 select  count(distinct nir) as nb_nir from diane_eyiq15.c9_e0_calculer_metier_pr_cj7;
 select  count(distinct nir) as nb_nir from diane_eyiq15.c18_e0_calculer_metier_pr_cj7;
 select  count(distinct nir) as nb_nir from diane_eyiq15.c13_e0_calculer_metier_pr_cj7;


/* Nb postes*/
 select  count(distinct siret_affectation||nir) as nb_postes from diane_eyiq15.c8_e0_calculer_metier_pr_cj7
;

/* Nb postes par versant*/
 select  count(distinct siret_affectation||nir) as nb_postes ,versant_fp
from diane_eyiq15.c13_e0_calculer_metier_pr_cj7
GROUP BY versant_fp ;

/* Nb postes par versant et statut_contrat*/
 select  count(distinct siret_affectation||nir) as nb_postes,versant_fp,statut_contrat_fp
from diane_eyiq15.c13_e0_calculer_metier_pr_cj7
GROUP BY versant_fp,statut_contrat_fp ;



/* Equations utilisées dans le Karnaugh */
    select   /*versant_fp,*/ statut_contrat_fp, pop_part_pub, ind_fonc,  num_k_periode, eqsalbrut, eqsalnet,count(*), 'c9' as campagne
 FROM diane_eyiq15.c9_e0_calculer_metier_pr_cj7
group by   /* versant_fp,*/ind_fonc, statut_contrat_fp, pop_part_pub, num_k_periode, eqsalbrut, eqsalnet
union
    select  /* versant_fp, */statut_contrat_fp, pop_part_pub, ind_fonc,  num_k_periode, eqsalbrut, eqsalnet,count(*), 'c18' as campagne
 FROM diane_eyiq15.c18_e0_calculer_metier_pr_cj7
group by    /*versant_fp,*/ind_fonc, statut_contrat_fp, pop_part_pub, num_k_periode, eqsalbrut, eqsalnet
union   
select   /*versant_fp, */statut_contrat_fp, pop_part_pub, ind_fonc,  num_k_periode, eqsalbrut, eqsalnet,count(*),'c13' as campagne
 FROM diane_eyiq15.c13_e0_calculer_metier_pr_cj7
group by   /* versant_fp,*/ind_fonc, statut_contrat_fp, pop_part_pub, num_k_periode, eqsalbrut, eqsalnet
 ;
 
     select   /*versant_fp, */ num_k_periode, eqsalbrut, eqsalnet,count(*)
 FROM diane_eyiq15.c8_e0_calculer_metier_pr_cj7
group by   versant_fp,  num_k_periode, eqsalbrut, eqsalnet
order by   versant_fp,  num_k_periode, eqsalbrut, eqsalnet
 ;
  /* Salaires */
 
 select versant_fp,
 sum (s_brut) as sum_sbrut,
 sum (s_net) as sum_snet,
 sum (bascsg) as sum_csg,
 sum (brut_s) as sum_deplaf,
 sum (net_d) as sum_netd
 from diane_eyiq15.c13_e0_calculer_metier_pr_cj7
 group by versant_fp
 
 
  /* Nb postes par versant et statut_contrat*/

drop table if exists postes_c13 ;
create table postes_c13 as
 select  siret_affectation||nir as poste,
 nir, motif_fin_per_fp,
 max(versant_fp) as versant,

  sum (sal_chom) as sum_rem002,
   sum (montant_rem010) as sum_rem010,
     sum (base_ircantec) as sum_ircantec,
  
 sum (s_brut) as sum_sbrut,
 sum (s_net) as sum_snet,
 sum (bascsg) as sum_csg,
 sum (brut_s) as sum_deplaf,
 sum (net_d) as sum_netd,
 sum (net_verse) as sum_netverse,
 max(statut_contrat_fp) as statut_contrat,
 max(pop_part_pub) as pop_part_pub
 from diane_eyiq15.c13_e0_calculer_metier_pr_cj7
GROUP BY siret_affectation,nir, motif_fin_per_fp ;

select * from postes limit 1

   select 
  avg(sum_csg) as avg_csg,
  PERCENTILE_CONT(0.05) WITHIN GROUP (ORDER BY sum_csg ASC) as pct05_csg,
  PERCENTILE_CONT(0.10) WITHIN GROUP (ORDER BY sum_csg ASC) as pct10_csg,
  PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY sum_csg ASC) as pct25_csg,
  PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY sum_csg ASC) as pct50_csg,
  PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY sum_csg ASC) as pct75_csg,
  PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY sum_csg ASC) as pct90_csg,
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY sum_csg ASC) as pct95_csg
  from postes_c13 ;

drop table if exists fusion;
create table fusion as 
select *,
case when poste is null then 'c9' 
	when poste_c9 is null then 'c13'
	else 'les2' end as presence
from postes_c13 as c13 
	full join 
	(select nir as nir_c9, motif_fin_per_fp as motiffin_c9, poste as poste_c9,
	versant as versant_c9,
	sum_sbrut as sum_sbrut_c9,
 	sum_snet as sum_snet_c9,
 	sum_csg as sum_csg_c9,
 	sum_deplaf as sum_deplaf_c9,
	sum_netd as sum_netd_c9,
	statut_contrat as statut_contrat_c9,
	pop_part_pub as pop_part_pub_c9 
 	from postes_c9) as  c9 
 on c9.poste_c9=c13.poste;

 select count(*),presence
from fusion 
group by presence;
/* Salaires */
 
 select versant,
 sum (sum_sbrut) as sum_sbrut,
 sum (sum_snet) as sum_snet,
 sum (sum_csg) as sum_csg,
 sum (sum_deplaf) as sum_deplaf,
 sum (sum_netd) as sum_netd
 from fusion
  where presence='c13'
  group by versant;
 


   select 
  avg(sum_csg_c8) as avg_csg,
  PERCENTILE_CONT(0.05) WITHIN GROUP (ORDER BY sum_csg_c8 ASC) as pct05_csg,
  PERCENTILE_CONT(0.10) WITHIN GROUP (ORDER BY sum_csg_c8 ASC) as pct10_csg,
  PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY sum_csg_c8 ASC) as pct25_csg,
  PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY sum_csg_c8 ASC) as pct50_csg,
  PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY sum_csg_c8 ASC) as pct75_csg,
  PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY sum_csg_c8 ASC) as pct90_csg,
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY sum_csg_c8 ASC) as pct95_csg
  from fusion 
  where presence='les2';


select * from fusion
where presence='les2' and sum_csg_c9=0 and sum_netd_c9>0 and sum_deplaf_c9=0 and versant='FPT';



 











