Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
01-05-2026

Inwerkingtreding:
01-05-2026

11.3 Wat is het langdurend ziekteverzuimpercentage excl. zwangerschapsverlof?

Concepten

Relaties

Eigenschappen

Instanties

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: ZK 11.3
2# Parameters: ?jaar, ?kwartaal, ?zorgkantoor
3# Ontologie: versie 3.0 of nieuwer
4
5PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
6PREFIX onz-org: <http://purl.org/ozo/onz-org#>
7PREFIX time:    <http://www.w3.org/2006/time#>
8PREFIX onz-pers:<http://purl.org/ozo/onz-pers#>
9PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
10
11SELECT (?vestiging AS ?Indeling)
12  		(IF(SUM(?noemer_som_zorg) = 0, "Ongedefinieerd",
13        ROUND( (100.0 * SUM(?ziekte_som_zorg) / SUM(?noemer_som_zorg)) * 100 ) / 100
14        ) AS ?Zorg)
15      (IF(SUM(?noemer_som_niet_zorg) = 0, "Ongedefinieerd",
16        ROUND( (100.0 * SUM(?ziekte_som_niet_zorg) / SUM(?noemer_som_niet_zorg)) * 100 ) / 100
17        ) AS ?Niet_zorg)
18  		(IF(SUM(?noemer_som_totaal) = 0, "Ongedefinieerd",
19        ROUND( (100.0 * SUM(?ziekte_som_totaal) / SUM(?noemer_som_totaal)) * 100 ) / 100
20        ) AS ?Totaal)
21WHERE 
22{
23  {
24    SELECT
25      	?overeenkomst_afspraak 
26      	?persoon 
27      	(SUM(?ziekte_verzuim_zorg) AS ?ziekte_som_zorg) 
28      	(SUM(?noemer_afspraak_zorg) AS ?noemer_som_zorg) 
29      	(SUM(?ziekte_verzuim_niet_zorg) AS ?ziekte_som_niet_zorg) 
30      	(SUM(?noemer_afspraak_niet_zorg) AS ?noemer_som_niet_zorg) 
31      	(SUM(?ziekte_verzuim_totaal) AS ?ziekte_som_totaal) 
32      	(SUM(?noemer_afspraak_totaal) AS ?noemer_som_totaal) 
33    WHERE
34    {
35      # TELLER: selecteer het ?ziekte_verzuim van de medewerkers per persoon per werkovereenkomstafspraak
36      {
37        SELECT    
38          ?overeenkomst_afspraak
39          ?persoon
40          ?ziekte_verzuim_zorg
41          ?ziekte_verzuim_niet_zorg
42          ?ziekte_verzuim_totaal
43          ("0.0"^^xsd:decimal AS ?noemer_afspraak_zorg)
44          ("0.0"^^xsd:decimal AS ?noemer_afspraak_niet_zorg)
45          ("0.0"^^xsd:decimal AS ?noemer_afspraak_totaal)
46        WHERE {
47                 
48          # BIND(2024 AS ?jaar)  
49          # BIND("Q2" AS ?kwartaal)             
50          BIND(IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
51                 IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
52                 IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
53                 IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
54                 ?unbound)))) AS ?start_periode)
55            BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
56
57          # Selecteer alle arbeidsovereenkomsten die geldig zijn
58          ?overeenkomst a onz-pers:ArbeidsOvereenkomst ; onz-g:hasPart ?overeenkomst_afspraak .
59          ?overeenkomst onz-pers:heeftOpdrachtnemer ?persoon .
60          ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ; onz-g:hasPart ?omvang ; onz-g:startDatum ?start_afspraak .
61          OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
62          FILTER (?start_afspraak <= ?eind_periode && (?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak)))
63
64          # Bepaal per overeenkomstafspraak de ptf en zorg/niet-zorg
65          ?omvang a onz-pers:ContractOmvang ; onz-g:isAbout ?omvang_waarde .
66          ?omvang_waarde a onz-pers:ContractOmvangWaarde ; onz-g:hasDataValue ?omvang_getal ; onz-g:hasUnitOfMeasure ?omvang_eenheid .
67          ?omvang_eenheid onz-g:hasDataValue ?eenheid_factor .
68          BIND(?omvang_getal/(36/?eenheid_factor) AS ?ptf)
69
70          # Check zorg/niet zorg personeel
71          BIND(IF(EXISTS {?overeenkomst_afspraak onz-g:isAbout/a onz-pers:ZorgverlenerFunctie}, 1, 0) AS ?is_zorg)
72          
73          # Clip de afspraak op het kwartaal
74          BIND(IF(?start_afspraak < ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr)
75          BIND(IF(?eind_afspraak > ?eind_periode || !BOUND(?eind_afspraak), ?eind_periode, ?eind_afspraak) AS ?eind_afspraak_corr)
76
77          # Check per afspraak of er ziekteverzuim is en wanneer deze start en eindigt 
78          OPTIONAL {
79            VALUES ?type_verzuim { onz-pers:ZiektePeriode   }
80            ?ziekte a ?type_verzuim ; onz-g:definedBy ?overeenkomst ; onz-g:startDatum ?start_ziekte_periode .
81            ?start_ziekte_periode ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_ziekte_periode_reken .
82            OPTIONAL { ?ziekte onz-g:eindDatum ?eind_ziekte_periode }
83
84            OPTIONAL {
85              ?ziekte onz-g:hasQuality ?verzuim_tijd .
86              ?verzuim_tijd a onz-pers:VerzuimTijdKwaliteit ; onz-g:hasQualityValue ?verzuim_waarde .
87              ?verzuim_waarde onz-g:hasUnitOfMeasure onz-g:percent ; onz-g:startDatum ?start_verzuim_waarde_temp .
88              OPTIONAL { ?verzuim_waarde onz-g:hasDataValue ?verzuim_percentage }
89              OPTIONAL { ?verzuim_waarde onz-g:eindDatum ?eind_verzuim_waarde_temp }
90            }
91          }
92
93          # Zorg ervoor dat ziekteperiodes overlappen met de looptijd van de afspraak en het kwartaal 
94          FILTER((?start_ziekte_periode <= ?eind_afspraak_corr && (?eind_ziekte_periode >= ?start_afspraak_corr || !BOUND(?eind_ziekte_periode))))
95		  FILTER ((?start_ziekte_periode <= ?eind_periode && (?eind_ziekte_periode >= ?start_periode || !BOUND(?eind_ziekte_periode))))
96
97          # Zorg ervoor dat verzuimperiodes overlappen met de looptijd van de afspraak en het kwartaal 
98          FILTER ((?start_verzuim_waarde_temp <= ?eind_periode && (?eind_verzuim_waarde_temp >= ?start_periode || !BOUND(?eind_verzuim_waarde_temp))))
99          FILTER ((?start_verzuim_waarde_temp <= ?eind_afspraak_corr && (!BOUND(?eind_verzuim_waarde_temp) || ?eind_verzuim_waarde_temp >= ?start_afspraak_corr)) )
100
101          # Bepaal de einddatum van de ziekteperiode (als langer doorloopt óf geen einddatum: klip op het einde van het kwartaal)
102          BIND(IF(!BOUND(?ziekte), ?unbound, IF(!BOUND(?eind_ziekte_periode) || ?eind_ziekte_periode > ?eind_periode, ?eind_periode, ?eind_ziekte_periode)) AS ?eind_ziekte_periode_clip)
103          OPTIONAL { FILTER(BOUND(?eind_ziekte_periode_clip)) ?eind_ziekte_periode_clip ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_ziekte_periode_reken }
104
105          # Filter op langdurige ziekte (> 28 dagen)
106          BIND(IF( !BOUND(?eind_ziekte_periode_reken) || !BOUND(?start_ziekte_periode_reken), ?unbound, ?eind_ziekte_periode_reken - ?start_ziekte_periode_reken + 1) AS ?dagen_ziekte_periode)
107          FILTER(?dagen_ziekte_periode > 28)
108
109          # Zorg dat de start- en eind verzuimdatum binnen de meetperiode vallen
110          BIND(IF(?start_verzuim_waarde_temp < ?start_afspraak_corr, ?start_afspraak_corr, ?start_verzuim_waarde_temp) AS ?start_verzuim_waarde_final)
111          BIND(IF(!BOUND(?eind_verzuim_waarde_temp), ?eind_afspraak_corr, IF(?eind_verzuim_waarde_temp > ?eind_afspraak_corr, ?eind_afspraak_corr, ?eind_verzuim_waarde_temp)) AS 
112                        ?eind_verzuim_waarde_final)
113
114          # Bereken per verzuimperiode het aantal zieke dagen
115          OPTIONAL {
116            FILTER(BOUND(?start_verzuim_waarde_final) && BOUND(?eind_verzuim_waarde_final))
117            ?start_verzuim_waarde_final ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_verzuim_waarde_final_reken .
118            ?eind_verzuim_waarde_final  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_verzuim_waarde_final_reken .
119            BIND(?eind_verzuim_waarde_final_reken - ?start_verzuim_waarde_final_reken + 1 AS ?dagen_verzuim_periode)
120          }
121
122          # Bereken het ziekteverzuim per dag (PTF * ZIEKTEPERCENTAGE * DAGEN VERZUIM PERIODE)
123          BIND(IF(BOUND(?verzuim_percentage), xsd:decimal(?verzuim_percentage), 100.0) AS ?pct)
124          BIND(IF(BOUND(?dagen_verzuim_periode), ?ptf * (?pct / 100.0) * ?dagen_verzuim_periode, ?unbound) AS ?ziekte_verzuim_totaal)
125          BIND(?ziekte_verzuim_totaal * ?is_zorg AS ?ziekte_verzuim_zorg)
126          BIND(?ziekte_verzuim_totaal - ?ziekte_verzuim_zorg AS ?ziekte_verzuim_niet_zorg)
127        } 
128      }   
129      UNION
130      # Noemer: selecteer ptf * dagen afspraak van de medewerkers per persoon per afspraak, ongeacht verzuim
131      {
132        SELECT    
133          ?overeenkomst_afspraak
134          ?persoon
135          ("0.0"^^xsd:decimal AS ?ziekte_verzuim_niet_zorg)
136          ("0.0"^^xsd:decimal AS ?ziekte_verzuim_zorg)
137          ("0.0"^^xsd:decimal AS ?ziekte_verzuim_totaal)
138          ?noemer_afspraak_niet_zorg
139          ?noemer_afspraak_zorg
140          ?noemer_afspraak_totaal
141        WHERE 
142        {
143		      # BIND(2024 AS ?jaar)  
144          # BIND("Q2" AS ?kwartaal)               
145          BIND(IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
146                 IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
147                 IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
148                 IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
149                 ?unbound)))) AS ?start_periode)
150            BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
151
152          # Selecteer alle arbeidsovereenkomsten die geldig zijn
153          ?overeenkomst a onz-pers:ArbeidsOvereenkomst ; onz-g:hasPart ?overeenkomst_afspraak .
154          ?overeenkomst onz-pers:heeftOpdrachtnemer ?persoon .
155          ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ; onz-g:hasPart ?omvang ; onz-g:startDatum ?start_afspraak .
156          OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
157          FILTER (?start_afspraak <= ?eind_periode && (?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak)))
158
159          # Bepaal per overeenkomstafspraak de ptf en zorg/niet-zorg
160          ?omvang a onz-pers:ContractOmvang ; onz-g:isAbout ?omvang_waarde .
161          ?omvang_waarde a onz-pers:ContractOmvangWaarde ; onz-g:hasDataValue ?omvang_getal ; onz-g:hasUnitOfMeasure ?omvang_eenheid .
162          ?omvang_eenheid onz-g:hasDataValue ?eenheid_factor .
163          BIND(?omvang_getal/(36/?eenheid_factor) AS ?ptf)
164          
165          # Check zorg/niet zorg personeel
166          BIND(IF(EXISTS {?overeenkomst_afspraak onz-g:isAbout/a onz-pers:ZorgverlenerFunctie}, 1, 0) AS ?is_zorg)
167
168          # Clip de afspraak op het kwartaal
169          BIND(IF(?start_afspraak < ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr)
170          BIND(IF(?eind_afspraak > ?eind_periode || !BOUND(?eind_afspraak), ?eind_periode, ?eind_afspraak) AS ?eind_afspraak_corr)
171
172          # Bereken hoeveel dagen van de afspraak overlappen met de meetperiode
173          ?start_afspraak_corr ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_afspraak_reken .
174          ?eind_afspraak_corr  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_afspraak_reken .
175          BIND(?eind_afspraak_reken - ?start_afspraak_reken + 1 AS ?dagen_afspraak)
176          
177          # Noemer per afspraak = PTF * kalenderdagen binnen meetperiode
178          BIND(?ptf * ?dagen_afspraak AS ?noemer_afspraak_totaal)
179          BIND(?noemer_afspraak_totaal * ?is_zorg AS ?noemer_afspraak_zorg)
180          BIND(?noemer_afspraak_totaal - ?noemer_afspraak_zorg AS ?noemer_afspraak_niet_zorg)
181        } 
182      }   
183    } 
184    GROUP BY ?overeenkomst_afspraak ?persoon
185  } 
186
187  {
188   # per vestiging
189   ?overeenkomst_afspraak onz-g:isAbout ?locatie .
190   ?locatie a onz-g:StationaryArtifact ; 
191     onz-g:partOf* ?vestiging_uri .
192   ?vestiging_uri a onz-org:Vestiging ;
193     onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
194   BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
195   ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
196   ?zk_regio a onz-org:ZorgkantoorRegio .
197   ?zorgkantoor onz-g:hasOperatingRange ?zk_regio .
198    
199   ?vestiging_uri onz-g:identifiedBy ?vest_nr .
200   ?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
201   }
202   UNION
203   {
204   # totaal organisatie
205   BIND("Organisatie (gecontracteerd + algemeen)" AS ?vestiging)
206   }
207
208} 
209GROUP BY ?vestiging
210ORDER BY ?Indeling