lib; INSERT INTO pmsi.t_unites_medicales(code, texte) SELECT UNITE_MEDICALE.CODE, MAX(UPPER(UNITE_MEDICALE.LIB)) FROM prod_sigems.UNITE_MEDICALE LEFT JOIN pmsi.t_unites_medicales ON t_unites_medicales.code = UNITE_MEDICALE.CODE WHERE t_unites_medicales.code IS NULL GROUP BY UNITE_MEDICALE.CODE ORDER BY UNITE_MEDICALE.CODE; UPDATE pmsi.t_diagnostics SET texte = CIM10.LIBELL FROM prod_sigems.CIM10 WHERE 1=1 AND t_diagnostics.code = t_diagnostics.texte AND t_diagnostics.code = CIM10.DIAG AND t_diagnostics.texte != CIM10.LIBELL; -- maj des établissements insérés juste avec le finess UPDATE base.t_etablissements SET texte = NOM, texte_court = NOM FROM prod_sigems.ETAB_CONV WHERE 1=1 AND ETAB_CONV.NUM_FINESS = t_etablissements.code AND t_etablissements.code = t_etablissements.texte ; ]]> '' THEN NMA_PAT ELSE NOM_PAT END)) AS NOM_PAT, MAX(COALESCE(NAISSANCES.NOM,NOM_PAT)) AS NNA_PAT, MAX(COALESCE(NAISSANCES.PRENOM,PRE_PAT)) AS PRE_PAT, MAX(CCH_DOS) AS CCH_DOS, MAX(CPH_DOS) AS CPH_DOS FROM prod_sigems.ETAT_PMSI JOIN prod_sigems.DOSSIER ON trim(ANN_DOS) || trim(COD_DOS) = trim(ETAT_PMSI.ANNEE) || trim(ETAT_PMSI.CODE) JOIN prod_sigems.PATIENT ON DOSSIER.CPH_DOS = PATIENT.COD_PAT LEFT JOIN prod_sigems.NAISSANCES ON ANNEE = NAISSANCES.ANN AND CODE = NAISSANCES.COD AND ENFANT = NAISSANCES.NUM_RUM - 50 WHERE NUMERO_RSS <> 0 GROUP BY ANNEE, CODE, ENFANT; CREATE INDEX w_RSS_i1 ON w_RSS USING btree (NUMERO_RSS); CREATE INDEX w_RSS_i2 ON w_RSS USING btree (CCH_DOS); CREATE INDEX w_RSS_i3 ON w_RSS USING btree (ANNEE_CODE); UPDATE [SCHEMA].p_identites SET nom = NOM_PAT, nom_naissance = NNA_PAT, prenom = PRE_PAT FROM [SCHEMA].p_rss JOIN w_RSS ON NUMERO_RSS = no_rss WHERE p_identites.rss_id = p_rss.oid AND (SORTIE = date_sortie OR ENTREE = date_entree) AND ( nom IS DISTINCT FROM NOM_PAT OR nom_naissance IS DISTINCT FROM NNA_PAT OR prenom IS DISTINCT FROM PRE_PAT ); UPDATE [SCHEMA].p_rss SET medecin_rss_id = COALESCE(t_medecins.oid,0), no_patient = CPH_DOS FROM w_RSS LEFT JOIN pmsi.t_medecins ON CCH_DOS = t_medecins.code WHERE NUMERO_RSS = no_rss AND (SORTIE = date_sortie OR ENTREE = date_entree) AND ( medecin_rss_id IS DISTINCT FROM COALESCE(t_medecins.oid,0) OR no_patient IS DISTINCT FROM CPH_DOS ); -- D'après numéro de séjour -- au préalable, on reformate les numéros de séjour sur 7 ou 8 caractères. Il se peut que les numéros soient sur 16,17 ou 18 caractères, -- ce qui ne colle pas avec l'activité. S'ils sont sur 16, on dégage les 8 derniers caractères qui sont une date, -- si c'est sur 17, il faut ignorer le premier caractère et sortir les 9 derniers caractères -- si c'est sur 18, il faut sortir la date et deux caractères supplémentaires (je ne sais pas ce qu'ils font là) -- la table w_new permet de passer sur 7 caractères les dossiers qui ont un 0 en troisième caractère pour coller avec l'activité. WITH w_brut AS ( SELECT oid as rss_id, CASE WHEN char_length(no_sejour_administratif) = 16 THEN substring(no_sejour_administratif from 1 for char_length(no_sejour_administratif) - 8) WHEN char_length(no_sejour_administratif) = 17 THEN substring(no_sejour_administratif from 2 for char_length(no_sejour_administratif) - 9) WHEN char_length(no_sejour_administratif) = 18 THEN substring(no_sejour_administratif from 1 for char_length(no_sejour_administratif) - 10) ELSE no_sejour_administratif END as no_sejour_brut FROM [SCHEMA].p_rss WHERE char_length(no_sejour_administratif) > 7 ), w_new AS ( SELECT rss_id, no_sejour_brut ,CASE WHEN substring(no_sejour_brut from 3 for 1) = '0' THEN substr(no_sejour_brut, 1, 2) || substr(no_sejour_brut, 4, 5) ELSE no_sejour_brut END as no_sejour_new FROM w_brut ORDER BY w_brut.no_sejour_brut DESC ) UPDATE [SCHEMA].p_rss SET no_sejour_administratif = w_new.no_sejour_new FROM w_new WHERE 1=1 AND p_rss.oid = w_new.rss_id AND p_rss.no_sejour_administratif != w_new.no_sejour_new AND (SELECT count(*) FROM pg_tables where tablename LIKE 'hl7%' AND schemaname = 'prod_sigems') = 0; DROP TABLE IF EXISTS w_DOSSIER; CREATE TEMP TABLE w_DOSSIER AS SELECT ANN_DOS AS ANNEE, COD_DOS AS CODE, ANN_DOS || to_char(COD_DOS,'FM900000') AS ANNEE_CODE, date(MAX(DEN_DOS)) AS ENTREE, date(MAX(DSO_DOS)) AS SORTIE, MAX(COALESCE(CASE WHEN NMA_PAT <> '' THEN NMA_PAT ELSE NOM_PAT END,'')) AS NOM_PAT, MAX(COALESCE(NOM_PAT,'')) AS NNA_PAT, MAX(COALESCE(PRE_PAT,'')) AS PRE_PAT, MAX(CCH_DOS) AS CCH_DOS, MAX(CPH_DOS) AS CPH_DOS, MAX(substr(CPO_PAT,1,5)) AS CPO_PAT FROM prod_sigems.DOSSIER LEFT JOIN prod_sigems.PATIENT ON DOSSIER.CPH_DOS = PATIENT.COD_PAT GROUP BY ANN_DOS, COD_DOS; CREATE INDEX w_DOSSIER_i1 ON w_DOSSIER USING btree (CCH_DOS); CREATE INDEX w_DOSSIER_i2 ON w_DOSSIER USING btree (ANNEE_CODE); -- Externes UPDATE [SCHEMA].p_identites SET nom = NOM_PAT, nom_naissance = NNA_PAT, prenom = PRE_PAT FROM [SCHEMA].p_rss JOIN w_DOSSIER ON ANNEE_CODE = no_sejour_administratif WHERE NOM_PAT <> '' AND (SORTIE = date_sortie OR ENTREE = date_entree) AND ghm_id = 0 AND p_identites.rss_id = p_rss.oid AND ( nom IS DISTINCT FROM NOM_PAT OR nom_naissance IS DISTINCT FROM NNA_PAT OR prenom IS DISTINCT FROM PRE_PAT ); UPDATE [SCHEMA].p_rss SET code_postal = CPO_PAT, code_postal_id = COALESCE(t_codes_postaux_c.oid,0) FROM w_DOSSIER LEFT JOIN pmsi.t_codes_postaux_c ON CPO_PAT = t_codes_postaux_c.code WHERE ANNEE_CODE = no_sejour_administratif AND (SORTIE = date_sortie OR ENTREE = date_entree) AND ghm_id = 0 AND ( code_postal IS DISTINCT FROM CPO_PAT ); UPDATE [SCHEMA].p_rss SET medecin_rss_id = COALESCE(t_medecins.oid,0), no_patient = CPH_DOS FROM w_DOSSIER JOIN pmsi.t_medecins ON CCH_DOS = t_medecins.code WHERE ANNEE_CODE = no_sejour_administratif AND (SORTIE = date_sortie OR ENTREE = date_entree) AND ghm_id = 0 AND ( medecin_rss_id IS DISTINCT FROM COALESCE(t_medecins.oid,0) OR no_patient IS DISTINCT FROM CPH_DOS ); -- Hospitalisés (si pas trouvés par RSS) UPDATE [SCHEMA].p_identites SET nom = NOM_PAT, nom_naissance = NNA_PAT, prenom = PRE_PAT FROM [SCHEMA].p_rss JOIN w_DOSSIER ON ANNEE_CODE = no_sejour_administratif WHERE NOM_PAT <> '' AND p_identites.nom LIKE 'RSS%' AND p_identites.rss_id = p_rss.oid AND (SORTIE = date_sortie OR ENTREE = date_entree) AND ( nom IS DISTINCT FROM NOM_PAT OR nom_naissance IS DISTINCT FROM NNA_PAT OR prenom IS DISTINCT FROM PRE_PAT ); UPDATE [SCHEMA].p_rss SET medecin_rss_id = COALESCE(t_medecins.oid,0), no_patient = CPH_DOS FROM w_DOSSIER JOIN pmsi.t_medecins ON CCH_DOS = t_medecins.code WHERE ANNEE_CODE = no_sejour_administratif AND (SORTIE = date_sortie OR ENTREE = date_entree) AND ghm_id <> 0 AND medecin_rss_id = 0 AND ( medecin_rss_id IS DISTINCT FROM COALESCE(t_medecins.oid,0) OR no_patient IS DISTINCT FROM CPH_DOS ); -- Pour les séances qui peuvent avoir plusieurs RSS par dossier, le matching des dates E/S ne marche pas UPDATE [SCHEMA].p_identites SET nom = NOM_PAT, nom_naissance = NNA_PAT, prenom = PRE_PAT FROM [SCHEMA].p_rss JOIN pmsi.t_ghm ON t_ghm.oid = p_rss.ghm_id JOIN w_DOSSIER ON ANNEE_CODE = no_sejour_administratif WHERE NOM_PAT <> '' AND p_identites.nom LIKE 'RSS%' AND p_identites.rss_id = p_rss.oid AND t_ghm.code LIKE '28%' AND ( nom IS DISTINCT FROM NOM_PAT OR nom_naissance IS DISTINCT FROM NNA_PAT OR prenom IS DISTINCT FROM PRE_PAT ); UPDATE [SCHEMA].p_rss SET medecin_rss_id = COALESCE(t_medecins.oid,0), no_patient = CPH_DOS FROM w_DOSSIER JOIN pmsi.t_medecins ON CCH_DOS = t_medecins.code, pmsi.t_ghm WHERE ANNEE_CODE = no_sejour_administratif AND t_ghm.oid = p_rss.ghm_id AND t_ghm.code LIKE '28%' AND medecin_rss_id = 0 AND ( medecin_rss_id IS DISTINCT FROM COALESCE(t_medecins.oid,0) OR no_patient IS DISTINCT FROM CPH_DOS ); ]]> 0; ]]> 0 OR ghs_id <> 0) AND t_unites_medicales.type_sejour = '3'; ]]> t_unites_medicales.code ); INSERT INTO pmsi.t_unites_medicales (code, texte) SELECT SER_DOS, NOM_SER FROM w_rss_ser JOIN prod_sigems.SERVICE ON SER_DOS = COD_SER WHERE SER_DOS NOT IN (SELECT code FROM pmsi.t_unites_medicales) GROUP BY 1,2; UPDATE [SCHEMA].p_rss_rum SET unite_medicale_id = t_unites_medicales.oid FROM w_rss_ser JOIN pmsi.t_unites_medicales ON SER_DOS = t_unites_medicales.code WHERE p_rss_rum.rss_id = w_rss_ser.oid AND unite_medicale_id = 0; UPDATE [SCHEMA].p_rss SET unite_medicale_principale_id = t_unites_medicales.oid FROM w_rss_ser JOIN pmsi.t_unites_medicales ON SER_DOS = t_unites_medicales.code WHERE p_rss.oid = w_rss_ser.oid AND unite_medicale_principale_id = 0; ]]> p_rss.no_rss ; UPDATE [SCHEMA].p_identites p_rss_x SET no_rss = p_rss.no_rss FROM [SCHEMA].p_rss WHERE p_rss.oid = rss_id AND p_rss_x.no_rss <> p_rss.no_rss ; ]]> 1 ou -1 UPDATE prod_sigems.lig_clini SET QTE_LCL = QTE_LCL / abs(QTE_LCL) WHERE pro_lcl = 'GHS' AND round(QTE_LCL * COG_LCL * COO_LCL * PUN_LCL / 100) <> round(TAR_LCL) AND round(QTE_LCL / abs(QTE_LCL) * COG_LCL * COO_LCL * PUN_LCL / 100) = round(TAR_LCL) AND QTE_LCL <> 0 ]]> lib; INSERT INTO pmsi.t_unites_medicales(code, texte) SELECT UNITE_MEDICALE.CODE, UPPER(UNITE_MEDICALE.LIB) FROM prod_sigems.UNITE_MEDICALE LEFT JOIN pmsi.t_unites_medicales ON t_unites_medicales.code = UNITE_MEDICALE.CODE WHERE t_unites_medicales.code IS NULL GROUP BY UNITE_MEDICALE.CODE, UPPER(UNITE_MEDICALE.LIB) ORDER BY UNITE_MEDICALE.CODE; UPDATE pmsi.t_diagnostics SET texte = CIM10.LIBELL FROM prod_sigems.CIM10 WHERE 1=1 AND t_diagnostics.code = t_diagnostics.texte AND t_diagnostics.code = CIM10.DIAG AND t_diagnostics.texte != CIM10.LIBELL; DROP TABLE IF EXISTS w_periode; CREATE TEMP TABLE w_periode AS SELECT GREATEST(MIN(date_sortie),'[ANNEE]0101'::date) AS fildeleau_debut, date(now()) AS fildeleau_fin FROM pmsi.p_rss WHERE en_cours = '0' ; ANALYSE w_periode ; ]]> 1; DROP TABLE IF EXISTS w_dossier; CREATE TEMP TABLE w_DOSSIER AS SELECT ANN_DOS || to_char(COD_DOS,'FM900000') AS no_sejour, ANN_DOS AS no_sejour_ANNEE, COD_DOS AS no_sejour_CODE, SER_DOS, DEN_DOS, DSO_DOS, MDT_DOS FROM w_periode, prod_sigems.dossier JOIN prod_sigems.dossier_x ON ANN_DOS = ANN_DOX AND COD_DOS = COD_DOX WHERE ANN_DOS NOT LIKE 'PA%' AND (DSO_DOS >= fildeleau_debut OR DEN_DOS >=fildeleau_debut OR DSO_DOS IS NULL) AND (DEN_DOS <= fildeleau_fin AND DSO_DOS IS NULL OR DSO_DOS <= fildeleau_fin); CREATE INDEX w_dossier_i1 ON w_dossier USING btree (no_sejour); CREATE INDEX w_dossier_i2 ON w_dossier USING btree (no_sejour_CODE); -- Dossiers administratifs non codés en PMSI DROP TABLE IF EXISTS w_DOS2_ABAND; CREATE TEMP TABLE w_DOS2_ABAND AS SELECT ANN_DOS2 || to_char(COD_DOS2,'FM900000') AS no_sejour FROM prod_sigems.DOS2 WHERE NDK_DOS2 = 'ABAND' GROUP BY 1; DROP TABLE IF EXISTS w_UN_RUM_non_codes; CREATE TEMP TABLE w_UN_RUM_non_codes AS SELECT no_sejour AS NUM_RSS, 1::numeric AS NUM_RUM, SER_DOS AS NUM_UM, DEN_DOS AS ENTREE, '8'::text AS MODE_ENTREE, '':: text AS PROVENANCE, DSO_DOS AS SORTIE, '8'::text AS MODE_SORTIE, ''::text AS DESTINATION, ''::text AS GHM, ''::text AS IGS_REEL FROM w_dossier LEFT JOIN pmsi.t_divers t_select_ser ON t_select_ser.code = 'FILDELEAU_SER' WHERE MDT_DOS NOT IN ('07') AND (t_select_ser.valeur IS NULL OR t_select_ser.valeur = '' OR replace(SER_DOS, ',', '@') = ANY (string_to_array(replace(t_select_ser.valeur,' ',''),','))) AND no_sejour NOT IN (SELECT num_rss FROM prod_sigems.UN_RUM) AND no_sejour NOT IN (SELECT no_sejour_administratif FROM pmsi.p_rss WHERE en_cours = '0' AND etat = '') AND no_sejour NOT IN (SELECT no_sejour FROM w_DOS2_ABAND) ORDER BY 1; -- Etat du RUM DROP TABLE IF EXISTS w_UN_RUM_ghm; CREATE TEMP TABLE w_UN_RUM_ghm AS SELECT NUM_RSS::text AS NUM_RSS, substr(NUM_RSS,1,2) AS NUM_RSS_ANNEE, base.cti_to_number(substr(NUM_RSS,3)) AS NUM_RSS_CODE, CASE WHEN NUM_RUM <= 50 THEN 0 ELSE NUM_RUM - 50 END AS ENFANT, '1'::text AS in_un_rum, MAX(CASE WHEN CLE_GHM NOT LIKE '90%' THEN COALESCE(CLE_GHM,'') ELSE '' END) AS CLE_GHM, COUNT(DISTINCT num_um) AS NB_UM, MAX(CASE WHEN t_select_um.valeur IS NULL OR t_select_um.valeur = '' OR replace(NUM_UM, ',', '@') = ANY (string_to_array(replace(t_select_um.valeur,' ',''),',')) THEN '1' ELSE '0' END) AS RSS_OK_um, MAX(CASE WHEN t_select_ser.valeur IS NULL OR t_select_ser.valeur = '' OR replace(SER_DOS, ',', '@') = ANY (string_to_array(replace(t_select_ser.valeur,' ',''),',')) THEN '1' ELSE '0' END) AS RSS_OK_ser FROM prod_sigems.UN_RUM JOIN pmsi.t_unites_medicales ON UN_RUM.NUM_UM = t_unites_medicales.code JOIN w_dossier ON NUM_RSS = no_sejour LEFT JOIN prod_sigems.PMSI_GHM ON UN_RUM.GHM = PMSI_GHM.CODE_GHM LEFT JOIN pmsi.t_divers t_select_um ON t_select_um.code = 'FILDELEAU_UM' LEFT JOIN pmsi.t_divers t_select_ser ON t_select_ser.code = 'FILDELEAU_SER' WHERE base.cti_to_number(substr(NUM_RSS,3)) <> 0 GROUP BY 1,2,3,4 HAVING MAX(t_unites_medicales.type_sejour) IS DISTINCT FROM '9'; INSERT INTO w_UN_RUM_ghm SELECT NUM_RSS AS NUM_RSS, substr(NUM_RSS,1,2) AS NUM_RSS_ANNEE, base.cti_to_number(substr(NUM_RSS,3)) AS NUM_RSS_CODE, CASE WHEN NUM_RUM <= 50 THEN 0 ELSE NUM_RUM - 50 END AS ENFANT, '0'::text AS in_un_rum, MAX(CASE WHEN CLE_GHM NOT LIKE '90%' THEN COALESCE(CLE_GHM,'') ELSE '' END) AS CLE_GHM, COUNT(DISTINCT num_um) AS NB_UM, MAX(CASE WHEN t_select_um.valeur IS NULL OR t_select_um.valeur = '' OR replace(NUM_UM, ',', '@') = ANY (string_to_array(replace(t_select_um.valeur,' ',''),',')) THEN '1' ELSE '0' END) AS RSS_OK_um, MAX(CASE WHEN t_select_ser.valeur IS NULL OR t_select_ser.valeur = '' OR replace(SER_DOS, ',', '@') = ANY (string_to_array(replace(t_select_ser.valeur,' ',''),',')) THEN '1' ELSE '0' END) AS RSS_OK_ser FROM w_UN_RUM_non_codes UN_RUM JOIN pmsi.t_unites_medicales ON UN_RUM.NUM_UM = t_unites_medicales.code JOIN w_dossier ON NUM_RSS = no_sejour LEFT JOIN prod_sigems.PMSI_GHM ON UN_RUM.GHM = PMSI_GHM.CODE_GHM LEFT JOIN pmsi.t_divers t_select_um ON t_select_um.code = 'FILDELEAU_UM' LEFT JOIN pmsi.t_divers t_select_ser ON t_select_ser.code = 'FILDELEAU_SER' WHERE base.cti_to_number(substr(NUM_RSS,3)) <> 0 GROUP BY 1,2,3,4 HAVING MAX(t_unites_medicales.type_sejour) IS DISTINCT FROM '9'; CREATE INDEX w_UN_RUM_ghm_i1 ON w_UN_RUM_ghm USING btree (NUM_RSS); CREATE INDEX w_UN_RUM_ghm_i2 ON w_UN_RUM_ghm USING btree (NUM_RSS_CODE); -- Eliminer code GHM pour des multi rum incomplets en PMSI UPDATE w_UN_RUM_ghm SET CLE_GHM = '' FROM ( SELECT ANN_SEJ, COD_SEJ FROM prod_sigems.sejour JOIN w_UN_RUM_ghm ON ANN_SEJ = NUM_RSS_ANNEE AND COD_SEJ = NUM_RSS_CODE WHERE CLE_GHM IS DISTINCT FROM '' AND CLE_GHM NOT LIKE '90%' GROUP BY 1,2 HAVING COUNT(DISTINCT SER_SEJ) > 1 AND MAX(NB_UM) IS DISTINCT FROM COUNT(DISTINCT SER_SEJ) AND MAX(das_sej)::date >= (now()::date - interval '1 day') ORDER BY 1,2 ) subview WHERE ANN_SEJ = NUM_RSS_ANNEE AND COD_SEJ = NUM_RSS_CODE; DROP TABLE IF EXISTS w_ETAT_PMSI; CREATE TEMP TABLE w_ETAT_PMSI AS SELECT NUM_RSS, ANNEE, CODE, ETAT_PMSI.ENFANT, MAX(CLE_GHM) AS CLE_GHM, MAX(NUMERO_RSS) AS NUMERO_RSS, MAX(SORTIE) AS SORTIE, MAX(ETAT) AS ETAT, MAX(trim(ETAT_PMSI.ANNEE) || trim(ETAT_PMSI.CODE)) AS ETAT_PMSI_JOINTURE_DOSSIER FROM prod_sigems.ETAT_PMSI JOIN w_UN_RUM_ghm ON trim(ETAT_PMSI.ANNEE) || trim(ETAT_PMSI.CODE) = w_UN_RUM_ghm.NUM_RSS_ANNEE || w_UN_RUM_ghm.NUM_RSS_CODE AND w_UN_RUM_GHM.ENFANT = ETAT_PMSI.ENFANT AND w_UN_RUM_GHM.RSS_OK_um = '1' AND w_UN_RUM_GHM.RSS_OK_ser = '1' GROUP BY 1,2,3,4; INSERT INTO w_ETAT_PMSI SELECT NUM_RSS, ANNEE, CODE, ETAT_PMSI.ENFANT, MAX(CLE_GHM) AS CLE_GHM, MAX(NUMERO_RSS) AS NUMERO_RSS, MAX(SORTIE) AS SORTIE, MAX(ETAT) AS ETAT, MAX(trim(ETAT_PMSI.jointure)) AS ETAT_PMSI_JOINTURE_DOSSIER FROM prod_sigems.ETAT_PMSI JOIN w_UN_RUM_ghm ON trim(ETAT_PMSI.jointure) != '' AND trim(ETAT_PMSI.jointure) = w_UN_RUM_ghm.NUM_RSS_ANNEE || lpad(w_UN_RUM_ghm.NUM_RSS_CODE,6,'0') AND w_UN_RUM_GHM.ENFANT = ETAT_PMSI.ENFANT AND w_UN_RUM_GHM.RSS_OK_um = '1' AND w_UN_RUM_GHM.RSS_OK_ser = '1' --group by 1,2,3,4 limit 10 LEFT JOIN ( SELECT NUM_RSS as NUM_RSS_ok, ANNEE AS ANNEE_ok, CODE AS CODE_ok, ENFANT AS ENFANT_ok FROM w_ETAT_PMSI) sub ON NUM_RSS_ok = NUM_RSS AND ANNEE_ok = ANNEE AND CODE_ok = CODE AND ENFANT_ok = ETAT_PMSI.ENFANT WHERE annee_ok IS NULL GROUP BY 1,2,3,4; CREATE INDEX w_ETAT_PMSI_i1 ON w_ETAT_PMSI USING btree (CODE); CREATE INDEX w_ETAT_PMSI_i2 ON w_ETAT_PMSI USING btree (NUM_RSS); CREATE INDEX w_ETAT_PMSI_i3 ON w_ETAT_PMSI USING btree (ETAT_PMSI_JOINTURE_DOSSIER); INSERT INTO w_ETAT_PMSI SELECT NUM_RSS, NUM_RSS_ANNEE, to_number(NUM_RSS_CODE,'FM00000'), 0, MAX(CLE_GHM) AS CLE_GHM, MAX('-' || NUM_RSS)::numeric AS NUMERO_RSS, MAX(DSO_DOS::date) AS SORTIE, 0 AS ETAT, MAX( trim(w_UN_RUM_ghm.NUM_RSS_ANNEE) || trim(w_UN_RUM_ghm.NUM_RSS_CODE) ) AS ETAT_PMSI_JOINTURE_DOSSIER FROM w_UN_RUM_ghm JOIN w_dossier ON NUM_RSS = no_sejour WHERE true AND in_un_rum = '0' AND w_UN_RUM_GHM.RSS_OK_um = '1' AND w_UN_RUM_GHM.RSS_OK_ser = '1' AND NUM_RSS NOT IN(SELECT NUM_RSS FROM w_ETAT_PMSI) GROUP BY 1,2,3,4 ; -- Mise à jour du champ SORTIE si absent et renseigné dans w_DOSSIER (SC-8251) WITH temp_w_dossier AS ( SELECT no_sejour ,min(DSO_DOS) as DSO_DOS FROM w_DOSSIER GROUP BY no_sejour ) UPDATE w_ETAT_PMSI SET SORTIE = temp_w_dossier.DSO_DOS FROM temp_w_dossier WHERE 1=1 AND temp_w_dossier.no_sejour = w_ETAT_PMSI.etat_pmsi_jointure_dossier AND temp_w_dossier.DSO_DOS IS DISTINCT FROM NULL AND w_ETAT_PMSI.SORTIE IS NULL; DROP TABLE IF EXISTS w_CONTROLE_DIM; CREATE TEMP TABLE w_CONTROLE_DIM AS SELECT CONTROLE_DIM.ANNEE, CONTROLE_DIM.CODE, ENFANT, etat FROM prod_sigems.CONTROLE_DIM JOIN (SELECT annee,code, MAX(nl) as nl FROM prod_sigems.CONTROLE_DIM group by annee, code) as sub ON sub.annee = CONTROLE_DIM.annee and sub.code = CONTROLE_DIM.code WHERE CONTROLE_DIM.nl = sub.nl; -- GROUP BY 1,2,3 remplacé par un JOIN pour prendre le dernier état enregistré; CREATE INDEX w_CONTROLE_DIM_i1 ON w_CONTROLE_DIM USING btree (CODE); DROP TABLE IF EXISTS w_rss; CREATE TEMP TABLE w_rss AS SELECT (SELECT code FROM w_finess) AS finess, w_ETAT_PMSI.ANNEE AS ANNEE, w_ETAT_PMSI.CODE AS CODE, w_ETAT_PMSI.NUM_RSS AS ANNEE_CODE, NUMERO_RSS, w_ETAT_PMSI.ENFANT, 0::bigint AS rss_id, CPH_DOS, MAX(COALESCE(NAISSANCES.SEXE,SEX_PAT)) AS SEX_PAT, MAX(date(COALESCE(NAISSANCES.DAT,DNA_PAT))) AS DNA_PAT, MAX(COALESCE(NAISSANCES.NOM,CASE WHEN NMA_PAT <> '' THEN NMA_PAT ELSE NOM_PAT END)) AS NOM_PAT, MAX(COALESCE(NAISSANCES.NOM,NOM_PAT)) AS NNA_PAT, MAX(COALESCE(NAISSANCES.PRENOM,PRE_PAT)) AS PRE_PAT, MAX(substr(CPO_PAT,1,5)) AS CPO_PAT, MAX(DOSSIER.DEN_DOS) AS DEN_DOS, MAX(DOSSIER.DSO_DOS) AS DSO_DOS, MAX(DOSSIER.CCH_DOS) AS CCH_DOS, MAX(CASE WHEN DOSSIER.MSO_DOS <> '' THEN DOSSIER.MSO_DOS ELSE '80' END) AS MSO_DOS, MAX(w_ETAT_PMSI.CLE_GHM) AS CLE_GHM , COALESCE(MAX(GHS_VALORISE.GHS),'') AS GHS, MAX(COALESCE(w_CONTROLE_DIM.ETAT,0)) AS CONTROLE_DIM_ETAT, MAX(w_ETAT_PMSI.ETAT) AS ETAT_PMSI_ETAT, MAX(ERR) AS ERR, COALESCE(MAX(DOSSIER_SUPPL.PEC_RAAC),'') AS RAAC, COALESCE(MAX(DOSSIER_SUPPL.PASSAGE_URGE),'') AS PASSAGE_URGE, COALESCE(MAX(URGENCE),'0') AS NP, COALESCE(NULLIF(MAX(CONTEXTE_SURV),''),'0')::smallint AS CONTEXTE_SURV, COALESCE(NULLIF(MAX(ADMINIST_PROD_RH),''),'0')::smallint AS ADMINIST_PROD_RH, COALESCE(NULLIF(MAX(RESCRIT_TARIFAIRE),''),'0')::smallint AS RESCRIT_TARIFAIRE, COALESCE(MAX(CATEG_NB_INTERV), '') AS CATEG_NB_INTERV, p_rss.oid AS p_rss_id FROM w_periode, w_ETAT_PMSI LEFT JOIN prod_sigems.GHS_VALORISE ON w_ETAT_PMSI.CODE = GHS_VALORISE.CODE AND w_ETAT_PMSI.ANNEE = GHS_VALORISE.ANNEE AND w_ETAT_PMSI.ENFANT = GHS_VALORISE.ENFANT LEFT JOIN w_CONTROLE_DIM ON w_ETAT_PMSI.CODE = w_CONTROLE_DIM.CODE AND w_ETAT_PMSI.ANNEE = w_CONTROLE_DIM.ANNEE AND w_ETAT_PMSI.ENFANT = w_CONTROLE_DIM.ENFANT JOIN prod_sigems.DOSSIER ON trim(DOSSIER.ANN_DOS) || trim(DOSSIER.COD_DOS) = w_ETAT_PMSI.ETAT_PMSI_JOINTURE_DOSSIER LEFT JOIN prod_sigems.PMSI_DOSSIER ON trim(PMSI_DOSSIER.ANNEE) || trim(PMSI_DOSSIER.CODE) = w_ETAT_PMSI.ETAT_PMSI_JOINTURE_DOSSIER LEFT JOIN prod_sigems.DOSSIER_SUPPL ON trim(DOSSIER.ANN_DOS) || trim(DOSSIER.COD_DOS) = trim(DOSSIER_SUPPL.ANN_DOS) || trim(DOSSIER_SUPPL.COD_DOS) JOIN prod_sigems.PATIENT ON DOSSIER.CPH_DOS = PATIENT.COD_PAT LEFT JOIN prod_sigems.NAISSANCES ON w_ETAT_PMSI.ANNEE = NAISSANCES.ANN AND w_ETAT_PMSI.CODE = NAISSANCES.COD AND w_ETAT_PMSI.ENFANT = NAISSANCES.NUM_RUM - 50 LEFT JOIN pmsi.p_rss ON NUMERO_RSS = p_rss.no_rss AND p_rss.etat = '' AND date_part('month', SORTIE) = date_part('month', p_rss.date_sortie) AND date_part('year', SORTIE) = date_part('year', p_rss.date_sortie) LEFT JOIN prod_sigems.ERREURS_RSS ON ERREURS_RSS.ANNEE = w_ETAT_PMSI.ANNEE AND ERREURS_RSS.CODE = w_ETAT_PMSI.CODE LEFT JOIN prod_sigems.DOSSIER_Y ON DOSSIER_Y.ANNEE || to_char(DOSSIER_Y.CODE,'FM900000') = p_rss.no_sejour_administratif WHERE 1=1 AND SORTIE BETWEEN fildeleau_debut and fildeleau_fin AND DSO_DOS BETWEEN fildeleau_debut and fildeleau_fin AND NUMERO_RSS <> 0 AND w_ETAT_PMSI.NUM_RSS NOT IN ( SELECT ANN_LCL || to_char(COD_LCL,'FM900000') FROM prod_sigems.LIG_CLINI WHERE PRO_LCL IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7') ) AND w_ETAT_PMSI.NUM_RSS NOT IN (SELECT no_sejour_administratif FROM pmsi.p_rss WHERE en_cours = '0' AND etat = '') GROUP BY 1,2,3,4,5,6,7,8, p_rss.oid ORDER BY 1,2; UPDATE w_rss SET rss_id = nextval('pmsi.s_rss'::regclass), CLE_GHM = CASE WHEN CLE_GHM <> '' THEN CLE_GHM ELSE '99Z99Z' END; INSERT INTO pmsi.p_rss ( finess, oid, no_rss, no_patient, version_groupage, date_naissance, sexe, date_entree, date_sortie, mode_entree, provenance, mode_sortie, destination, code_postal, poids_bebe, igs2, cma, groupe_ghm, duree_sejour, nb_rsa, age, supprime, date_import, nb_rum, secteur, no_sejour_administratif, nb_seances, ghm_fg9, ghm_id, medecin_rss_id, ghs_id, mois_sortie, diagnostic_principal_id, diagnostic_relie_id, ghm_production_id, no_rum_principal, unite_medicale_principale_id, import_id, etat, acte_principal_id, code_postal_id, patient_id, prestation_principale_id, severite_fg11_simulation_code, en_cours, en_cours_etat, base_remboursement, sejour_facture, honoraires_factures, t2a_facture, dmi_facture, phc_facture, ca_ghs_theorique, nb_ghs, ca_ghs, nb_exb, ca_exb, nb_exh, ca_exh, nb_si, ca_si, nb_sur, ca_sur, nb_rea, ca_rea, nb_neonat, ca_neonat, traitement_epmsi, code_retour_groupage, comite_medical_id, rehosp_meme_ghm, from_oid, raac_id, np_id, passage_urgences_code, contexte_pat_id, adm_prod_reshospi_id, rescrit_tarif_id, nb_intervention_id ) SELECT w_rss.finess AS finess, w_rss.rss_id AS oid, w_rss.NUMERO_RSS AS no_rss, CPH_DOS AS no_patient, '' AS version_groupage, date(CASE WHEN substr(CLE_GHM,1,2) <> '15' THEN DNA_PAT ELSE DEN_DOS END) AS date_naissance, CASE WHEN SEX_PAT = 'F' THEN '2' ELSE '1' END AS sexe, date(DEN_DOS) AS date_entree, date(DSO_DOS) AS date_sortie, '8'::text AS mode_entree, ''::text AS provenance, SUBSTR(MSO_DOS,1,1) AS mode_sortie, CASE WHEN SUBSTR(MSO_DOS,2,1) <> '0' THEN SUBSTR(MSO_DOS,2,1) ELSE '' END AS destination, CPO_PAT AS code_postal, 0::numeric AS poids_bebe, 0 AS igs2, '' AS cma, substr(CLE_GHM , 3 , 1) AS groupe_ghm, CASE WHEN date(DSO_DOS) > date(DEN_DOS) THEN date(DSO_DOS) - date(DEN_DOS) ELSE 0 END AS duree_sejour, CASE WHEN substr(CLE_GHM,1,2) = '28' THEN 1 ELSE 1 END AS nb_rsa, LEAST(CASE WHEN date(DEN_DOS) > date(DNA_PAT) THEN trunc((date(DEN_DOS) - date(DNA_PAT)) / 365.25,0) ELSE 0 END, 999::numeric) AS age, '' AS supprime, now() AS date_import, 1 AS nb_rum, '' AS secteur, ANNEE_CODE AS no_sejour_administratif, CASE WHEN substr(CLE_GHM,1,2) = '28' THEN 1 ELSE 0 END AS nb_seances, '' AS ghm_fg9, COALESCE(t_ghm.oid, 0) AS ghm_id, COALESCE(t_medecins.oid, 0) AS medecin_rss_id, COALESCE(t_ghs.oid, 0) AS ghs_id, date_part('year', DSO_DOS) * 100 + date_part('month', DSO_DOS) AS mois_sortie, 0 AS diagnostic_principal_id, 0 AS diagnostic_relie_id, COALESCE(t_ghm.oid, 0) AS ghm_production_id, 1 AS no_rum_principal, 0 AS unite_medicale_principale_id, -1 AS import_id, '' AS etat, 0 AS acte_principal_id, 0 AS code_postal_id, 0 AS patient_id, 0 AS prestation_principale_id, '' AS severite_fg11_simulation_code, '1' AS en_cours, CASE WHEN length(CLE_GHM) = 6 AND CLE_GHM <> '' AND CLE_GHM NOT LIKE '90%' AND CLE_GHM NOT LIKE '99%' AND CONTROLE_DIM_ETAT >= 1 THEN 'V' WHEN length(CLE_GHM) = 6 AND CLE_GHM NOT LIKE '90%' AND CLE_GHM NOT LIKE '99%' AND CLE_GHM <> '' THEN 'G' ELSE 'S' END AS en_cours_etat, 0 AS base_remboursement, 0 AS sejour_facture, 0 AS honoraires_factures, 0 AS t2a_facture, 0 AS dmi_facture, 0 AS phc_facture, 0 AS ca_ghs_theorique, 0 AS nb_ghs, 0 AS ca_ghs, 0 AS nb_exb, 0 AS ca_exb, 0 AS nb_exh, 0 AS ca_exh, 0 AS nb_si, 0 AS ca_si, 0 AS nb_sur, 0 AS ca_sur, 0 AS nb_rea, 0 AS ca_rea, 0 AS nb_neonat, 0 AS ca_neonat, '' AS traitement_epmsi, ERR AS code_retour_groupage, 0 AS comite_medical_id, '0' AS rehosp_meme_ghm, 0 AS from_oid, COALESCE(t_raac.oid, 0) AS raac_id, COALESCE(t_np.oid,0) AS np_id, PASSAGE_URGE AS passage_urgences_code, CONTEXTE_SURV AS contexte_pat_id, ADMINIST_PROD_RH AS adm_prod_reshospi_id, RESCRIT_TARIFAIRE AS rescrit_tarif_id, COALESCE(t_nb_interventions.oid, 0) AS nb_intervention_id FROM w_rss LEFT JOIN pmsi.t_ghm ON CLE_GHM = t_ghm.code LEFT JOIN pmsi.t_ghs ON GHS = to_char(t_ghs.code,'FM0000') LEFT JOIN pmsi.t_medecins ON CCH_DOS = t_medecins.code LEFT JOIN pmsi.t_raac on w_rss.raac = t_raac.code LEFT JOIN pmsi.t_np on w_rss.np = t_np.code LEFT JOIN pmsi.t_nb_interventions ON w_rss.CATEG_NB_INTERV = t_nb_interventions.code WHERE w_rss.p_rss_id is NULL ; DELETE FROM pmsi.p_rss_leg WHERE rss_id IN (SELECT oid FROM pmsi.p_rss WHERE import_id = -1) ; -- transferts d'établissements INSERT INTO base.t_etablissements (code, texte, texte_court) SELECT NUM_FINESS, NOM, NOM FROM prod_sigems.ETAB_CONV WHERE 1=1 AND CODE IN (SELECT DISTINCT ETAB FROM prod_sigems.DOSSIER_Y) AND NUM_FINESS NOT IN (SELECT code FROM base.t_etablissements) ; INSERT INTO pmsi.p_rss_leg (finess, no_rsa, rss_id, code_retour_id, nombre) SELECT finess , 0 AS no_rsa , p_rss.oid AS rss_id , t_codes_retour_groupeur.oid , 1 FROM prod_sigems.ERREURS_RSS JOIN pmsi.t_codes_retour_groupeur ON t_codes_retour_groupeur.type = TYP AND t_codes_retour_groupeur.code = CASE WHEN TYP = 'P' THEN ERREURS_RSS.ERR ELSE to_char(CASE WHEN ERREURS_RSS.ERR IS NULL OR ERREURS_RSS.ERR = '' THEN '0' ELSE ERREURS_RSS.ERR::int END,'FM000') END JOIN pmsi.p_rss ON ANNEE || to_char(ERREURS_RSS.CODE::int,'FM00000') = no_sejour_administratif WHERE import_id = -1; INSERT INTO base.t_etablissements (code, texte, texte_court) SELECT NUM_FINESS, NOM, NOM FROM prod_sigems.ETAB_CONV WHERE 1=1 AND CODE IN (SELECT DISTINCT CH2 FROM prod_sigems.DOSSIER_Y) AND NUM_FINESS NOT IN (SELECT code FROM base.t_etablissements) ; ]]> 0 AND ( no_patient IS DISTINCT FROM CPH_DOS ); ]]> GREATEST(date(UN_RUM.ENTREE),date(DEN_DOS)) THEN LEAST(date(UN_RUM.SORTIE),date(DSO_DOS)) - GREATEST(date(UN_RUM.ENTREE),date(DEN_DOS)) ELSE 0 END AS duree_sejour, CASE WHEN CLE_GHM LIKE '28%' THEN 1 ELSE 0 END::numeric AS nb_seances, NUM_UM AS unite_medicale, COALESCE(t_diagnostics.oid,0) AS diagnostic_principal_id, COALESCE(t_diagnostics_relies.oid,0) AS diagnostic_relie_id, COALESCE(t_unites_medicales.oid,0) AS unite_medicale_id, '' AS type_autorisation, CASE WHEN trim(IGS_REEL) = '' OR NOT IGS_REEL ~ '^[0-9,\.]*$' THEN 0 ELSE round(base.cti_to_number(IGS_REEL::text)) END, '' AS type_autorisation_lit_dedie, '' AS supplement_code FROM prod_sigems.UN_RUM JOIN w_rss ON UN_RUM.NUM_RSS = w_rss.ANNEE_CODE AND CASE WHEN UN_RUM.NUM_RUM <= 50 THEN 0 ELSE UN_RUM.NUM_RUM - 50 END = w_rss.ENFANT LEFT JOIN w_DIAG_RUM ON w_DIAG_RUM.NUM_RSS = UN_RUM.NUM_RSS AND w_DIAG_RUM.NUM_RUM = UN_RUM.NUM_RUM LEFT JOIN pmsi.t_unites_medicales ON (NUM_UM = t_unites_medicales.code) LEFT JOIN pmsi.t_diagnostics ON (w_DIAG_RUM.DIAG_P = t_diagnostics.code) LEFT JOIN pmsi.t_diagnostics t_diagnostics_relies ON (w_DIAG_RUM.DIAG_R = t_diagnostics_relies.code) GROUP BY w_rss.finess , w_rss.rss_id , w_rss.NUMERO_RSS , MODE_ENTREE , PROVENANCE , MODE_SORTIE , DESTINATION , NUM_UM, COALESCE(t_diagnostics.oid,0), COALESCE(t_diagnostics_relies.oid,0), COALESCE(t_unites_medicales.oid,0), UN_RUM.NUM_RUM , UN_RUM.SORTIE, DSO_DOS, CLE_GHM , IGS_REEL, UN_RUM.ENTREE, UN_RUM.SORTIE, DEN_DOS ; -- RUM fictifs pour non codés PMSI INSERT INTO pmsi.p_rss_rum( finess, rss_id, no_rss, no_rum, date_entree, date_sortie, mode_entree, provenance, mode_sortie, destination, duree_sejour, nb_seances, unite_medicale, diagnostic_principal_id, diagnostic_relie_id, unite_medicale_id, type_autorisation, igs2, type_autorisation_lit_dedie, supplement_code) SELECT w_rss.finess AS finess, w_rss.rss_id AS rss_id, w_rss.NUMERO_RSS AS no_rss, CASE WHEN UN_RUM.NUM_RUM <= 50 THEN UN_RUM.NUM_RUM ELSE UN_RUM.NUM_RUM - 50 END AS no_rum, GREATEST(date(UN_RUM.ENTREE), date(DEN_DOS)) AS date_entree, LEAST(date(UN_RUM.SORTIE),date(DSO_DOS)) AS date_sortie, MODE_ENTREE AS mode_entree, PROVENANCE AS provenance, MODE_SORTIE AS mode_sortie, DESTINATION AS destination, CASE WHEN LEAST(date(UN_RUM.SORTIE),date(DSO_DOS)) > GREATEST(date(UN_RUM.ENTREE),date(DEN_DOS)) THEN LEAST(date(UN_RUM.SORTIE),date(DSO_DOS)) - GREATEST(date(UN_RUM.ENTREE),date(DEN_DOS)) ELSE 0 END AS duree_sejour, CASE WHEN CLE_GHM LIKE '28%' THEN 1 ELSE 0 END::numeric AS nb_seances, NUM_UM AS unite_medicale, 0 AS diagnostic_principal_id, 0 AS diagnostic_relie_id, COALESCE(t_unites_medicales.oid,0) AS unite_medicale_id, '' AS type_autorisation, CASE WHEN trim(IGS_REEL) = '' THEN 0 ELSE round(base.cti_to_number(IGS_REEL::text)) END, '' AS type_autorisation_lit_dedie, '' AS supplement_code FROM w_UN_RUM_non_codes UN_RUM JOIN w_rss ON UN_RUM.NUM_RSS = w_rss.ANNEE_CODE AND CASE WHEN UN_RUM.NUM_RUM <= 50 THEN 0 ELSE UN_RUM.NUM_RUM - 50 END = w_rss.ENFANT LEFT JOIN pmsi.t_unites_medicales ON (NUM_UM = t_unites_medicales.code); -- Quelques rum peuvent être créés en double DELETE FROM pmsi.p_rss_rum USING ( SELECT p_rss_rum.rss_id, p_rss_rum.no_rum, min(p_rss_rum.ctid) AS keep_ctid FROM pmsi.p_rss_rum JOIN pmsi.p_rss ON rss_id = p_rss.oid WHERE en_cours = '1' GROUP BY 1,2 HAVING count(*) > 1 ) subview WHERE p_rss_rum.rss_id = subview.rss_id AND p_rss_rum.no_rum = subview.no_rum AND p_rss_rum.Ctid <> keep_ctid ; DROP TABLE IF EXISTS w_rss_rum; CREATE TEMP TABLE w_rss_rum AS SELECT p_rss_rum.rss_id, count(*) AS nb_rum, SUM(p_rss_rum.nb_seances) AS nb_seances, MIN(no_rum) AS no_premier_rum, MAX(p_rss.passage_urgences_code) AS passage_urge FROM pmsi.p_rss_rum, pmsi.p_rss WHERE p_rss.oid = p_rss_rum.rss_id AND en_cours = '1' GROUP BY 1; -- On ajoute la variable passage urgence seulement sur le premier RUM UPDATE pmsi.p_rss_rum SET passage_urgences_code = w_rss_rum.passage_urge FROM w_rss_rum WHERE w_rss_rum.rss_id = p_rss_rum.rss_id AND no_rum = 1 AND w_rss_rum.passage_urge <> '' AND w_rss_rum.passage_urge IS DISTINCT FROM passage_urgences_code ; UPDATE pmsi.p_rss SET mode_entree = p_rss_rum.mode_entree, provenance = p_rss_rum.provenance, nb_rum = w_rss_rum.nb_rum, no_rum_principal = p_rss_rum.no_rum, unite_medicale_principale_id = p_rss_rum.unite_medicale_id, nb_seances = w_rss_rum.nb_seances FROM w_rss_rum, pmsi.p_rss_rum WHERE p_rss.oid = w_rss_rum.rss_id AND en_cours = '1' AND p_rss_rum.rss_id = w_rss_rum.rss_id AND p_rss_rum.no_rum = w_rss_rum.no_premier_rum; /********************************************************************************** * ETABLISSEMENT PROVENANCE ET DESTINATION (TRANSFERT) * **********************************************************************************/ -- Insertion des établissement de provenance et destination dans p_rss_transfert -- Traitement en commun réalisé dans import_rss_rsf_encours.php (generation_rum_post_traitements()) -- Grâce à la table w_TRANSFERTS DROP TABLE IF EXISTS temp.w_TRANSFERTS; CREATE TABLE temp.w_TRANSFERTS AS SELECT p_rss.oid AS rss_id, import_id, COALESCE(MIN(CASE WHEN mode_entree IN (7, 0) THEN provenance.oid ELSE null END),0) AS prov_id, COALESCE(MIN(CASE WHEN mode_sortie IN (7, 0) THEN destination.oid ELSE null END),0) AS dest_id FROM pmsi.p_rss JOIN prod_sigems.DOSSIER_Y ON ANNEE || to_char(DOSSIER_Y.CODE,'FM900000') = no_sejour_administratif LEFT JOIN prod_sigems.ETAB_CONV PROV ON CH2 = PROV.CODE LEFT JOIN prod_sigems.ETAB_CONV DEST ON ETAB = DEST.CODE LEFT JOIN base.t_etablissements provenance ON PROV.NUM_FINESS = provenance.code LEFT JOIN base.t_etablissements destination ON DEST.NUM_FINESS = destination.code WHERE 1=1 AND ( ETAB != '' OR CH2 != '') AND etat != 'S' GROUP BY 1,2 ; ]]> = 3 AND DFA_DOS2 IS NOT NULL JOIN w_rss ON ANN_LCL = w_rss.ANNEE AND COD_LCL = w_rss.CODE JOIN prod_sigems.PROD_CLINI ON PRO_LCL = COD_PRC JOIN pmsi.t_prestations ON ACT_PRC = t_prestations.code LEFT JOIN pmsi.t_ghs ON w_rss.GHS = to_char(t_ghs.code,'FM0000') WHERE PRO_LCL <> 'PJ' AND ACT_PRC <> 'PJ' AND TX1_LCL <> 0 AND ( w_rss.ENFANT = 0 AND PRO_LCL NOT IN ('GHS1', 'GHS2', 'GHS3', 'GHS4', 'GHS5') OR w_rss.ENFANT = 1 AND PRO_LCL = 'GHS1' OR w_rss.ENFANT = 2 AND PRO_LCL = 'GHS2' OR w_rss.ENFANT = 3 AND PRO_LCL = 'GHS3' OR w_rss.ENFANT = 4 AND PRO_LCL = 'GHS4' OR w_rss.ENFANT = 5 AND PRO_LCL = 'GHS5' ) ; -- mettre à jour le nombre de seances dans p_rss DROP TABLE IF EXISTS w_rss_nb_seances; CREATE TEMP TABLE w_rss_nb_seances AS SELECT no_rss, count(nombre) as nb_seances FROM pmsi.p_rsf_detail JOIN pmsi.t_ghs ON t_ghs.oid = p_rsf_detail.ghs_id JOIN pmsi.t_prestations ON t_prestations.oid = p_rsf_detail.prestation_id WHERE 1=1 AND (t_ghs.code = 9605 OR t_prestations.code = 'D11') GROUP BY 1 ; UPDATE pmsi.p_rss SET nb_seances = w_rss_nb_seances.nb_seances, nb_rsa = CASE WHEN t_ghm.code LIKE '28%' THEN w_rss_nb_seances.nb_seances ELSE nb_rsa END FROM w_rss_nb_seances, pmsi.t_ghm WHERE 1=1 AND p_rss.ghm_id = t_ghm.oid AND p_rss.no_rss = w_rss_nb_seances.no_rss AND en_cours = '1' AND (p_rss.nb_seances != w_rss_nb_seances.nb_seances OR p_rss.nb_rsa != CASE WHEN t_ghm.code LIKE '28%' THEN w_rss_nb_seances.nb_seances ELSE nb_rsa END ) ; ]]> 0 OR ghs_id <> 0) AND t_unites_medicales.type_sejour = '3'; ]]> t_unites_medicales.code ); INSERT INTO pmsi.t_unites_medicales (code, texte) SELECT SER_DOS, NOM_SER FROM w_rss_ser JOIN prod_sigems.SERVICE ON SER_DOS = COD_SER WHERE SER_DOS NOT IN (SELECT code FROM pmsi.t_unites_medicales) GROUP BY 1,2; UPDATE pmsi.t_unites_medicales SET texte = NOM_SER FROM prod_sigems.SERVICE LEFT JOIN prod_sigems.UNITE_MEDICALE ON COD_SER = UNITE_MEDICALE.CODE WHERE t_unites_medicales.code = COD_SER AND UNITE_MEDICALE.CODE IS NULL AND texte <> NOM_SER; UPDATE pmsi.p_rss_rum SET unite_medicale_id = t_unites_medicales.oid FROM w_rss_ser JOIN pmsi.t_unites_medicales ON SER_DOS = t_unites_medicales.code WHERE p_rss_rum.rss_id = w_rss_ser.oid AND unite_medicale_id = 0; UPDATE pmsi.p_rss SET unite_medicale_principale_id = t_unites_medicales.oid FROM w_rss_ser JOIN pmsi.t_unites_medicales ON SER_DOS = t_unites_medicales.code WHERE p_rss.oid = w_rss_ser.oid AND unite_medicale_principale_id = 0; ]]> = 0 THEN CONTROLE_DIM.DATE_ACTION::text ELSE '00010101' END]))[2]::date AS DATE_GROUPAGE, (MAX(Array[to_char(CONTROLE_DIM.NL,'FM0000'), CASE WHEN CONTROLE_DIM.ETAT >= 1 THEN CONTROLE_DIM.DATE_ACTION::text ELSE '00010101' END]))[2]::date AS DATE_VALIDATION FROM prod_sigems.CONTROLE_DIM WHERE ETAT <> 2 GROUP BY 1,2 ORDER BY 1,2 ; CREATE INDEX w_CONTROLE_DIM_i1 ON w_CONTROLE_DIM USING btree (CODE) ; UPDATE w_CONTROLE_DIM SET DATE_GROUPAGE = DATE_VALIDATION WHERE DATE_VALIDATION > DATE_GROUPAGE AND DATE_VALIDATION <> '00010101' ; UPDATE w_ETAT_PMSI SET DATE_GROUPAGE = CASE WHEN w_CONTROLE_DIM.DATE_GROUPAGE <> '00010101' THEN w_CONTROLE_DIM.DATE_GROUPAGE ELSE '20991231' END, DATE_VALIDATION = CASE WHEN w_CONTROLE_DIM.DATE_VALIDATION <> '00010101' THEN w_CONTROLE_DIM.DATE_VALIDATION ELSE '20991231' END FROM w_CONTROLE_DIM WHERE w_ETAT_PMSI.ANNEE = w_CONTROLE_DIM.ANNEE AND w_ETAT_PMSI.CODE = w_CONTROLE_DIM.CODE AND ( w_ETAT_PMSI.DATE_GROUPAGE IS DISTINCT FROM CASE WHEN w_CONTROLE_DIM.DATE_GROUPAGE <> '00010101' THEN w_CONTROLE_DIM.DATE_GROUPAGE ELSE '20991231' END OR w_ETAT_PMSI.DATE_VALIDATION IS DISTINCT FROM CASE WHEN w_CONTROLE_DIM.DATE_VALIDATION <> '00010101' THEN w_CONTROLE_DIM.DATE_VALIDATION ELSE '20991231' END ) ; CREATE INDEX w_ETAT_PMSI_i2 ON w_ETAT_PMSI USING btree (NUMERO_RSS) ; UPDATE pmsi.p_rss_etat SET date_groupage = CASE WHEN w_ETAT_PMSI.DATE_GROUPAGE >= w_ETAT_PMSI.date_sortie THEN w_ETAT_PMSI.DATE_GROUPAGE ELSE '20991231' END FROM pmsi.p_rss JOIN w_ETAT_PMSI ON NUMERO_RSS = no_rss AND date_trunc('month',p_rss.date_sortie) = date_trunc('month',w_ETAT_PMSI.date_sortie) WHERE p_rss_etat.rss_id = p_rss.oid AND p_rss_etat.date_groupage IS DISTINCT FROM CASE WHEN w_ETAT_PMSI.DATE_GROUPAGE >= w_ETAT_PMSI.date_sortie THEN w_ETAT_PMSI.DATE_GROUPAGE ELSE '20991231' END; DROP TABLE IF EXISTS w_DOS2; CREATE TEMP TABLE w_DOS2 AS SELECT ANN_DOS2 || to_char(COD_DOS2,'FM900000') AS no_sejour, date(MAX(DFA_DOS2)) AS DFA_DOS2 FROM prod_sigems.DOS2 WHERE ETA_DOS2 >= 3 AND DFA_DOS2 IS NOT NULL GROUP BY 1; CREATE INDEX w_DOS2_i1 ON w_DOS2 USING btree (no_sejour); UPDATE pmsi.p_rss_etat SET date_facture = CASE WHEN DFA_DOS2 >= date_sortie THEN DFA_DOS2 ELSE '20991231' END, est_facture = CASE WHEN DFA_DOS2 >= date_sortie AND DFA_DOS2 <> '20991231' THEN '1' ELSE '0' END FROM pmsi.p_rss JOIN w_DOS2 ON no_sejour = no_sejour_administratif WHERE p_rss_etat.rss_id = p_rss.oid AND ( date_facture IS DISTINCT FROM CASE WHEN DFA_DOS2 >= date_sortie THEN DFA_DOS2 ELSE '20991231' END OR est_facture IS DISTINCT FROM CASE WHEN DFA_DOS2 >= date_sortie AND DFA_DOS2 <> '20991231' THEN '1' ELSE '0' END ); UPDATE pmsi.p_rss_etat SET est_groupe = '1', est_valide = '1' WHERE est_facture = '1' AND (est_groupe = '0' OR est_valide = '0') ; UPDATE pmsi.p_rss_etat SET date_groupage = date_facture WHERE date_facture < date_groupage AND date_facture <> '20991231' AND date_groupage <> '20991231'; UPDATE pmsi.p_rss_etat SET date_groupage = '20991231' WHERE date_groupage <> '20991231' AND est_groupe IN ('0','9'); UPDATE pmsi.p_rss SET ghm_id = t_ghm_99Z98Z.oid, ghm_production_id = t_ghm_99Z98Z.oid FROM pmsi.p_rss_etat, pmsi.t_ghm, pmsi.t_ghm t_ghm_99Z98Z WHERE p_rss.oid = p_rss_etat.rss_id AND p_rss.ghm_id = t_ghm.oid AND t_ghm_99Z98Z.code = '99Z98Z' AND est_facture = '1' AND t_ghm.code = '99Z99Z' AND p_rss.oid NOT IN ( SELECT rss_id FROM pmsi.p_rsf_detail JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid WHERE t_prestations.code IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI', 'FFM', 'ATU') ); UPDATE pmsi.p_rss SET ghm_id = 0, ghm_production_id = 0 FROM pmsi.p_rss_etat, pmsi.t_ghm, pmsi.t_ghm t_ghm_99Z98Z WHERE p_rss.oid = p_rss_etat.rss_id AND p_rss.en_cours = '1' AND p_rss.ghm_id = t_ghm.oid AND t_ghm_99Z98Z.code = '99Z98Z' AND est_facture = '1' AND t_ghm.code = '99Z99Z' AND p_rss.oid NOT IN ( SELECT rss_id FROM pmsi.p_rsf_detail JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid WHERE t_prestations.code IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI', 'FFM', 'ATU') ); UPDATE pmsi.p_rss SET ghm_id = t_ghm_99Z99Z.oid, ghm_production_id = t_ghm_99Z99Z.oid FROM pmsi.p_rss_etat, pmsi.t_ghm, pmsi.t_ghm t_ghm_99Z99Z WHERE p_rss.oid = p_rss_etat.rss_id AND p_rss.ghm_id = t_ghm.oid AND t_ghm_99Z99Z.code = '99Z99Z' AND en_cours = '1' AND t_ghm.code LIKE '90%'; UPDATE pmsi.p_rss SET ghm_id = 0, ghm_production_id = 0 FROM pmsi.p_rss_etat, pmsi.t_ghm WHERE p_rss.oid = p_rss_etat.rss_id AND p_rss.en_cours = '1' AND p_rss.ghm_id = t_ghm.oid AND est_facture = '1' AND (t_ghm.code = '99Z99Z' OR ghm_id = 0) AND p_rss.oid IN ( SELECT rss_id FROM pmsi.p_rsf_detail JOIN pmsi.t_prestations ON prestation_id = t_prestations.oid WHERE t_prestations.code IN ('SE1', 'SE2', 'SE3', 'SE4', 'SE5', 'SE6', 'SE7', 'APE', 'AP2', 'FPI', 'FFM', 'ATU') ); UPDATE pmsi.p_rss SET en_cours_etat = 'F' FROM pmsi.p_rss_etat WHERE p_rss.oid = p_rss_etat.rss_id AND en_cours = '1' AND en_cours_etat IS DISTINCT FROM 'F' AND est_facture = 1 ; ]]>