Uitwisselprofiel Ministerie van VWS Beleidsontwikkeling over Macro-Economische Vraagstukken en Arbeidsmarkt

Over Uitwisselprofiel Ministerie van VWS Beleidsontwikkeling over Macro-Economische Vraagstukken en Arbeidsmarkt


Publicatiedatum:
22-01-2026

Inwerkingtreding:
01-03-2026

2.36. Wat is het langdurend ziekteverzuimpercentage (excl. zwangerschapsverlof)?

Concepten

Relaties

Eigenschappen

Instanties

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: MEVA 2.36
2# Parameters: ?jaar
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  ?Periode
12  		(?vestiging AS ?Indeling)
13  		(?zk_regio_code AS ?Zorgkantoorregio_code)
14  		(IF(SUM(?noemer_som) = 0, "Ongedefinieerd",
15        ROUND( (100.0 * SUM(?ziekte_som) / SUM(?noemer_som)) * 100 ) / 100
16        ) AS ?Procent_ziekteverzuim)
17WHERE 
18{
19  {
20    SELECT ?Periode
21      	?overeenkomst_afspraak 
22      	?persoon 
23      	(SUM(?ziekte_verzuim) AS ?ziekte_som) 
24      	(SUM(?noemer_afspraak) AS ?noemer_som) 
25    WHERE
26    {
27      # TELLER: selecteer het ?ziekte_verzuim van de medewerkers per persoon per werkovereenkomstafspraak
28      {
29        SELECT ?Periode    
30          ?overeenkomst_afspraak
31          ?persoon
32          ?ziekte_verzuim
33          ("0.0"^^xsd:decimal AS ?noemer_afspraak)
34        WHERE {
35                 
36		      #BIND(2024 AS ?jaar)             
37          VALUES ?kw { 1 2 3 4 0 }         
38
39          # Periode-bepaling
40          BIND( xsd:date(CONCAT(STR(?jaar), "-",
41                IF(?kw=1,"01-01", IF(?kw=2,"04-01", IF(?kw=3,"07-01", IF(?kw=4,"10-01","01-01"))))
42              )) AS ?start_periode )
43          BIND( xsd:date(CONCAT(STR(?jaar), "-",
44                IF(?kw=1,"03-31", IF(?kw=2,"06-30", IF(?kw=3,"09-30","12-31")))
45              )) AS ?eind_periode)
46          BIND( IF(?kw = 0, "Totaal jaar", CONCAT("Q", STR(?kw))) AS ?Periode )
47
48          # Selecteer alle arbeidsovereenkomsten die geldig zijn
49          ?overeenkomst a onz-pers:ArbeidsOvereenkomst ; onz-g:hasPart ?overeenkomst_afspraak .
50          ?overeenkomst onz-pers:heeftOpdrachtnemer ?persoon .
51          ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ; onz-g:hasPart ?omvang ; onz-g:startDatum ?start_afspraak .
52          OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
53          FILTER (?start_afspraak <= ?eind_periode && (?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak)))
54
55          # Bepaal per overeenkomstafspraak de ptf 
56          ?omvang a onz-pers:ContractOmvang ; onz-g:isAbout ?omvang_waarde .
57          ?omvang_waarde a onz-pers:ContractOmvangWaarde ; onz-g:hasDataValue ?omvang_getal ; onz-g:hasUnitOfMeasure ?omvang_eenheid .
58          ?omvang_eenheid onz-g:hasDataValue ?eenheid_factor .
59          BIND(?omvang_getal/(36/?eenheid_factor) AS ?ptf)
60          
61          # Clip de afspraak op het kwartaal
62          BIND(IF(?start_afspraak < ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr)
63          BIND(IF(?eind_afspraak > ?eind_periode || !BOUND(?eind_afspraak), ?eind_periode, ?eind_afspraak) AS ?eind_afspraak_corr)
64
65          # Check per afspraak of er ziekteverzuim is en wanneer deze start en eindigt 
66          OPTIONAL {
67            VALUES ?type_verzuim { onz-pers:ZiektePeriode  # onz-pers:ZwangerschapsVerlof (indien meenemen)
68            }
69            ?ziekte a ?type_verzuim ; onz-g:definedBy ?overeenkomst ; onz-g:startDatum ?start_ziekte_periode .
70            ?start_ziekte_periode ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_ziekte_periode_reken .
71            OPTIONAL { ?ziekte onz-g:eindDatum ?eind_ziekte_periode }
72
73            OPTIONAL {
74              ?ziekte onz-g:hasQuality ?verzuim_tijd .
75              ?verzuim_tijd a onz-pers:VerzuimTijdKwaliteit ; onz-g:hasQualityValue ?verzuim_waarde .
76              ?verzuim_waarde onz-g:hasUnitOfMeasure onz-g:percent ; onz-g:startDatum ?start_verzuim_waarde_temp .
77              OPTIONAL { ?verzuim_waarde onz-g:hasDataValue ?verzuim_percentage }
78              OPTIONAL { ?verzuim_waarde onz-g:eindDatum ?eind_verzuim_waarde_temp }
79            }
80          }
81
82          # Zorg ervoor dat ziekteperiodes overlappen met de looptijd van de afspraak en het kwartaal 
83          FILTER((?start_ziekte_periode <= ?eind_afspraak_corr && (?eind_ziekte_periode >= ?start_afspraak_corr || !BOUND(?eind_ziekte_periode))))
84		  FILTER ((?start_ziekte_periode <= ?eind_periode && (?eind_ziekte_periode >= ?start_periode || !BOUND(?eind_ziekte_periode))))
85
86          # Zorg ervoor dat verzuimperiodes overlappen met de looptijd van de afspraak en het kwartaal 
87          FILTER ((?start_verzuim_waarde_temp <= ?eind_periode && (?eind_verzuim_waarde_temp >= ?start_periode || !BOUND(?eind_verzuim_waarde_temp))))
88          FILTER ((?start_verzuim_waarde_temp <= ?eind_afspraak_corr && (!BOUND(?eind_verzuim_waarde_temp) || ?eind_verzuim_waarde_temp >= ?start_afspraak_corr)) )
89
90          # Bepaal de einddatum van de ziekteperiode (als langer doorloopt óf geen einddatum: klip op het einde van het kwartaal)
91          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)
92          OPTIONAL { FILTER(BOUND(?eind_ziekte_periode_clip)) ?eind_ziekte_periode_clip ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_ziekte_periode_reken }
93
94          # Filter op langdurige ziekte (> 28 dagen)
95          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)
96          FILTER(?dagen_ziekte_periode > 28 )
97
98          # Zorg dat de start- en eind verzuimdatum binnen de meetperiode vallen
99          BIND(IF(?start_verzuim_waarde_temp < ?start_afspraak_corr, ?start_afspraak_corr, ?start_verzuim_waarde_temp) AS ?start_verzuim_waarde_final)
100          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 
101                        ?eind_verzuim_waarde_final)
102
103          # Bereken per verzuimperiode het aantal zieke dagen
104          OPTIONAL {
105            FILTER(BOUND(?start_verzuim_waarde_final) && BOUND(?eind_verzuim_waarde_final))
106            ?start_verzuim_waarde_final ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_verzuim_waarde_final_reken .
107            ?eind_verzuim_waarde_final  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_verzuim_waarde_final_reken .
108            BIND(?eind_verzuim_waarde_final_reken - ?start_verzuim_waarde_final_reken + 1 AS ?dagen_verzuim_periode)
109          }
110
111          # Bereken het ziekteverzuim per dag (PTF * ZIEKTEPERCENTAGE * DAGEN VERZUIM PERIODE)
112          BIND(IF(BOUND(?verzuim_percentage), xsd:decimal(?verzuim_percentage), 100.0) AS ?pct)
113          BIND(IF(BOUND(?dagen_verzuim_periode), ?ptf * (?pct / 100.0) * ?dagen_verzuim_periode, ?unbound) AS ?ziekte_verzuim)
114        } 
115      }   
116      UNION
117      # Noemer: selecteer ptf * dagen afspraak van de medewerkers per persoon per afspraak, ongeacht verzuim
118      {
119        SELECT ?Periode    
120          ?overeenkomst_afspraak
121          ?persoon
122          ("0.0"^^xsd:decimal AS ?ziekte_verzuim)
123          ?noemer_afspraak
124        WHERE 
125        {
126		      #BIND(2024 AS ?jaar)             
127          VALUES ?kw { 1 2 3 4 0 }           # kwartalen + 0 = totaal jaar
128
129          # Periode-bepaling
130          BIND( xsd:date(CONCAT(STR(?jaar), "-",
131                IF(?kw=1,"01-01", IF(?kw=2,"04-01", IF(?kw=3,"07-01", IF(?kw=4,"10-01","01-01"))))
132              )) AS ?start_periode )
133          BIND( xsd:date(CONCAT(STR(?jaar), "-",
134                IF(?kw=1,"03-31", IF(?kw=2,"06-30", IF(?kw=3,"09-30","12-31")))
135              )) AS ?eind_periode)
136          BIND( IF(?kw = 0, "Totaal jaar", CONCAT("Q", STR(?kw))) AS ?Periode )
137
138          # Selecteer alle arbeidsovereenkomsten die geldig zijn
139          ?overeenkomst a onz-pers:ArbeidsOvereenkomst ; onz-g:hasPart ?overeenkomst_afspraak .
140          ?overeenkomst onz-pers:heeftOpdrachtnemer ?persoon .
141          ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ; onz-g:hasPart ?omvang ; onz-g:startDatum ?start_afspraak .
142          OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
143          FILTER (?start_afspraak <= ?eind_periode && (?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak)))
144
145          # Bepaal per overeenkomstafspraak de ptf
146          ?omvang a onz-pers:ContractOmvang ; onz-g:isAbout ?omvang_waarde .
147          ?omvang_waarde a onz-pers:ContractOmvangWaarde ; onz-g:hasDataValue ?omvang_getal ; onz-g:hasUnitOfMeasure ?omvang_eenheid .
148          ?omvang_eenheid onz-g:hasDataValue ?eenheid_factor .
149          BIND(?omvang_getal/(36/?eenheid_factor) AS ?ptf)
150
151          # Clip de afspraak op het kwartaal
152          BIND(IF(?start_afspraak < ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr)
153          BIND(IF(?eind_afspraak > ?eind_periode || !BOUND(?eind_afspraak), ?eind_periode, ?eind_afspraak) AS ?eind_afspraak_corr)
154
155          # Bereken hoeveel dagen van de afspraak overlappen met de meetperiode
156          ?start_afspraak_corr ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_afspraak_reken .
157          ?eind_afspraak_corr  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_afspraak_reken .
158          BIND(?eind_afspraak_reken - ?start_afspraak_reken + 1 AS ?dagen_afspraak)
159          
160          # Noemer per afspraak = PTF * kalenderdagen binnen meetperiode
161          BIND(?ptf * ?dagen_afspraak AS ?noemer_afspraak)
162        } 
163      }   
164    } 
165    GROUP BY ?Periode ?overeenkomst_afspraak ?persoon
166  } 
167
168  ?overeenkomst_afspraak onz-g:isAbout ?locatie .
169  {
170   # Tak 1: echte vestiging + afleiding zorgkantoorregio
171   ?locatie onz-g:partOf* ?vestiging_uri .
172   ?vestiging_uri a onz-org:Vestiging ;
173   onz-g:identifiedBy ?vest_nr ;
174   onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
175   ?vest_nr a onz-org:Vestigingsnummer ; onz-g:hasDataValue ?vestiging .
176
177   BIND(IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode)
178   ?pc_gebied onz-g:identifiedBy ?postcode ; onz-g:partOf+ ?zk_regio .
179   ?zk_regio a onz-org:ZorgkantoorRegio .
180   }
181   UNION
182   {
183   # Tak 2: totaal organisatie, laat ?zk_regio ongebonden (leeg in output)
184   ?locatie onz-g:partOf* ?vestiging_uri .
185   ?vestiging_uri onz-org:vestigingVan ?organisatie_uri .
186   BIND("Totaal organisatie" AS ?vestiging)
187   }
188
189   BIND(IF(BOUND(?zk_regio), STRAFTER(STR(?zk_regio), "/onz-org/"), ?unbound) AS ?zk_regio_code)
190
191} 
192GROUP BY ?Periode ?vestiging ?zk_regio_code
193ORDER BY ?Periode ?Indeling