Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling

Over Uitwisselprofiel Zorgkantoren Inkoopondersteuning en beleidsontwikkeling


Publicatiedatum:
01-05-2026

Inwerkingtreding:
01-05-2026

11.1 Wat is het kortdurend ziekteverzuimpercentage excl. zwangerschapsverlof?

Concepten

Relaties

Eigenschappen

Instanties

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: ZK 11.1 
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 
12  (?vestiging AS ?Indeling)
13  (IF(SUM(?noemer_som_zorg) = 0, "Ongedefinieerd",
14    ROUND( (100.0 * SUM(?ziekte_som_zorg) / SUM(?noemer_som_zorg)) * 100 ) / 100
15    ) AS ?Zorg)
16  (IF(SUM(?noemer_som_niet_zorg) = 0, "Ongedefinieerd",
17    ROUND( (100.0 * SUM(?ziekte_som_niet_zorg) / SUM(?noemer_som_niet_zorg)) * 100 ) / 100
18    ) AS ?Niet_zorg)
19  (IF(SUM(?noemer_som_totaal) = 0, "Ongedefinieerd",
20    ROUND( (100.0 * SUM(?ziekte_som_totaal) / SUM(?noemer_som_totaal)) * 100 ) / 100
21    ) AS ?Totaal)
22WHERE 
23{
24  {
25    SELECT
26      ?overeenkomst_afspraak 
27      ?persoon 
28      (SUM(?ziekte_verzuim_zorg) AS ?ziekte_som_zorg) 
29      (SUM(?noemer_afspraak_zorg) AS ?noemer_som_zorg) 
30      (SUM(?ziekte_verzuim_niet_zorg) AS ?ziekte_som_niet_zorg) 
31      (SUM(?noemer_afspraak_niet_zorg) AS ?noemer_som_niet_zorg) 
32      (SUM(?ziekte_verzuim_totaal) AS ?ziekte_som_totaal) 
33      (SUM(?noemer_afspraak_totaal) AS ?noemer_som_totaal) 
34    WHERE
35    {
36      # TELLER: selecteer het ?ziekte_verzuim van de medewerkers per persoon per werkovereenkomstafspraak
37      {
38        SELECT    
39          ?overeenkomst_afspraak
40          ?persoon
41          ?ziekte_verzuim_zorg
42          ?ziekte_verzuim_niet_zorg
43          ?ziekte_verzuim_totaal
44          ("0.0"^^xsd:decimal AS ?noemer_afspraak_zorg)
45          ("0.0"^^xsd:decimal AS ?noemer_afspraak_niet_zorg)
46          ("0.0"^^xsd:decimal AS ?noemer_afspraak_totaal)
47        WHERE {
48                 
49        #  BIND(2024 AS ?jaar)  # Parameter
50        #  BIND("Q2" AS ?kwartaal)  # Parameter           
51          BIND(IF(?kwartaal = 'Q1', xsd:date(CONCAT(STR(?jaar), '-01-01')),
52                 IF(?kwartaal = 'Q2', xsd:date(CONCAT(STR(?jaar), '-04-01')),
53                 IF(?kwartaal = 'Q3', xsd:date(CONCAT(STR(?jaar), '-07-01')),
54                 IF(?kwartaal = 'Q4', xsd:date(CONCAT(STR(?jaar), '-10-01')),
55                 ?unbound)))) AS ?start_periode)
56          BIND(?start_periode + "P3M"^^xsd:duration + "-P1D"^^xsd:duration AS ?eind_periode)
57
58          # Selecteer alle arbeidsovereenkomsten die geldig zijn
59          ?overeenkomst a onz-pers:ArbeidsOvereenkomst ; onz-g:hasPart ?overeenkomst_afspraak ; 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 kortdurende 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)  # Parameter
144        #  BIND("Q2" AS ?kwartaal)  # Parameter             
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 ; onz-pers:heeftOpdrachtnemer ?persoon .
154          ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ; onz-g:hasPart ?omvang ; onz-g:startDatum ?start_afspraak .
155          OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
156          FILTER (?start_afspraak <= ?eind_periode && (?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak)))
157
158          # Bepaal per overeenkomstafspraak de ptf en zorg/niet-zorg
159          ?omvang a onz-pers:ContractOmvang ; onz-g:isAbout ?omvang_waarde .
160          ?omvang_waarde a onz-pers:ContractOmvangWaarde ; onz-g:hasDataValue ?omvang_getal ; onz-g:hasUnitOfMeasure ?omvang_eenheid .
161          ?omvang_eenheid onz-g:hasDataValue ?eenheid_factor .
162          BIND(?omvang_getal/(36/?eenheid_factor) AS ?ptf)
163          
164          # Check zorg/niet zorg personeel
165          BIND(IF(EXISTS {?overeenkomst_afspraak onz-g:isAbout/a onz-pers:ZorgverlenerFunctie}, 1, 0) AS ?is_zorg)
166
167          # Clip de afspraak op het kwartaal
168          BIND(IF(?start_afspraak < ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr)
169          BIND(IF(?eind_afspraak > ?eind_periode || !BOUND(?eind_afspraak), ?eind_periode, ?eind_afspraak) AS ?eind_afspraak_corr)
170
171          # Bereken hoeveel dagen van de afspraak overlappen met de meetperiode
172          ?start_afspraak_corr ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_afspraak_reken .
173          ?eind_afspraak_corr  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_afspraak_reken .
174          BIND(?eind_afspraak_reken - ?start_afspraak_reken + 1 AS ?dagen_afspraak)
175          
176          # Noemer per afspraak = PTF * kalenderdagen binnen meetperiode
177          BIND(?ptf * ?dagen_afspraak AS ?noemer_afspraak_totaal)
178          BIND(?noemer_afspraak_totaal * ?is_zorg AS ?noemer_afspraak_zorg)
179          BIND(?noemer_afspraak_totaal - ?noemer_afspraak_zorg AS ?noemer_afspraak_niet_zorg)
180        } 
181      }   
182    } 
183    GROUP BY ?overeenkomst_afspraak ?persoon
184  } 
185
186  {
187   ?overeenkomst_afspraak onz-g:isAbout ?locatie .
188   # Tak 1: echte vestiging + afleiding zorgkantoorregio
189   ?locatie a onz-g:StationaryArtifact ; onz-g:partOf* ?vestiging_uri .
190   ?vestiging_uri a onz-org:Vestiging ;
191     onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
192   BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
193   ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
194   ?zk_regio a onz-org:ZorgkantoorRegio .
195   ?zorgkantoor onz-g:hasOperatingRange ?zk_regio .
196   ?vestiging_uri onz-g:identifiedBy ?vest_nr .
197   ?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
198   }
199   UNION
200   {
201   # Tak 2: totaal organisatie, laat ?zk_regio ongebonden (leeg in output)
202   BIND("Organisatie (gecontracteerd + algemeen)" AS ?vestiging)
203   }
204
205} 
206GROUP BY ?vestiging
207ORDER BY ?Indeling