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.2. Wat is het gemiddeld aantal personeelsleden?

Concepten

Relaties

Eigenschappen

SPARQL query

Code gekopieerd

...

Kopieer naar klembord

1# Indicator: MEVA 2.2
2# Parameters: ?jaar
3# Ontologie: versie 3.0.0 of nieuwer
4
5PREFIX onz-g:   <http://purl.org/ozo/onz-g#>
6PREFIX onz-pers:<http://purl.org/ozo/onz-pers#>
7PREFIX onz-org: <http://purl.org/ozo/onz-org#>
8PREFIX rdfs:    <http://www.w3.org/2000/01/rdf-schema#>
9PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>
10PREFIX time:    <http://www.w3.org/2006/time#>
11
12SELECT ?Periode
13  (?vestiging AS ?Indeling)
14  (ROUND(SUM(IF(?maanden_periode <= 0, 0, IF(?zorg_aandeel / ?maanden_periode > 1, 1, ?zorg_aandeel / ?maanden_periode))) * 100) / 100 AS ?Zorg)
15  (ROUND(SUM(IF(?maanden_periode <= 0, 0, IF(?niet_zorg_aandeel / ?maanden_periode > 1, 1, ?niet_zorg_aandeel / ?maanden_periode))) * 100) / 100 AS ?Niet_zorg)
16  (ROUND(SUM(IF(?maanden_periode <= 0, 0, IF((?zorg_aandeel + ?niet_zorg_aandeel) / ?maanden_periode > 1, 1, (?zorg_aandeel + ?niet_zorg_aandeel) / ?maanden_periode))) * 100) / 100 AS ?Totaal)
17
18WHERE {
19  # -------------------------------
20  # MIDDENLAAG: per persoon × vestiging
21  # -------------------------------
22  SELECT ?Periode
23    ?vestiging
24    ?persoon
25    ?maanden_periode
26    # MERGE/UNION: aantal unieke maanden met dekking per categorie
27    (SUM(?zorg_maanden_uni)      AS ?zorg_aandeel)
28    (SUM(?niet_zorg_maanden_uni) AS ?niet_zorg_aandeel)
29  WHERE {
30    # -------------------------------
31    # BINNENLAAG: knip afspraken, tel unieke dagen per categorie
32    # -------------------------------
33    {
34      SELECT ?Periode
35        ?vestiging
36        ?persoon
37        ?maanden_periode
38        (COUNT(DISTINCT ?maand_id_zorg)     AS ?zorg_maanden_uni)
39        (COUNT(DISTINCT ?maand_id_nietzorg) AS ?niet_zorg_maanden_uni)
40      WHERE {
41        # ---- Parameters & periode ----
42        #BIND(2024 AS ?jaar)
43        VALUES ?kw { 1 2 3 4 0 }
44
45        BIND( xsd:date(CONCAT(STR(?jaar), "-",
46                            IF(?kw=1,"01-01", IF(?kw=2,"04-01", IF(?kw=3,"07-01", IF(?kw=4,"10-01", "01-01"))))
47              )) AS ?start_periode )
48        BIND( xsd:date(CONCAT(STR(?jaar), "-",
49                  IF(?kw=1,"03-31", IF(?kw=2,"06-30", IF(?kw=3,"09-30","12-31")))
50              )) AS ?eind_periode )
51        BIND( IF(?kw = 0, "Totaal jaar", CONCAT("Q", STR(?kw))) AS ?Periode )
52
53        ?start_periode ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_periode_numeriek .
54        ?eind_periode  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?eind_periode_numeriek .
55        BIND(IF(?kw = 0, 12, 3) AS ?maanden_periode)
56
57        # ---- Geldige werkovereenkomsten ----
58        VALUES ?personeels_overeenkomst {
59          onz-pers:ArbeidsOvereenkomst
60          onz-pers:UitzendOvereenkomst
61          onz-pers:InhuurOvereenkomst
62        }
63
64        # ---- Afspraken + knippen ----
65        ?overeenkomst a ?personeels_overeenkomst ;
66                      onz-pers:heeftOpdrachtnemer ?persoon ;
67                      onz-g:hasPart ?overeenkomst_afspraak .
68		OPTIONAL { ?overeenkomst onz-g:eindDatum ?overeenkomst_eind }
69
70        ?overeenkomst_afspraak a onz-pers:WerkOvereenkomstAfspraak ;
71                                onz-g:startDatum ?start_afspraak ;
72                          onz-g:isAbout ?functie ;
73                          onz-g:isAbout ?locatie .
74        OPTIONAL { ?overeenkomst_afspraak onz-g:eindDatum ?eind_afspraak }
75        FILTER( ?start_afspraak <= ?eind_periode && ( ?eind_afspraak >= ?start_periode || !BOUND(?eind_afspraak) ) )
76
77        BIND( IF(?start_afspraak <  ?start_periode, ?start_periode, ?start_afspraak) AS ?start_afspraak_corr )
78		BIND( IF(!BOUND(?eind_afspraak), IF(BOUND(?overeenkomst_eind) && ?overeenkomst_eind < ?eind_periode, ?overeenkomst_eind, ?eind_periode),
79        IF(?eind_afspraak > ?eind_periode, ?eind_periode, ?eind_afspraak)) AS ?eind_afspraak_corr )
80        FILTER(?start_afspraak_corr <= ?eind_afspraak_corr)
81
82        # ---- Categorie & vestiging ----
83        ?functie a onz-g:OccupationalPositionRole .
84        BIND( IF(EXISTS { ?functie a onz-pers:ZorgverlenerFunctie }, 1, 0) AS ?zorg_boolean )
85
86        ?locatie a onz-g:StationaryArtifact ;
87                  onz-g:partOf* ?vestiging_uri .
88        {
89            # Tak 1: echte vestiging + afleiding zorgkantoorregio
90            ?vestiging_uri a onz-org:Vestiging ;
91            onz-g:identifiedBy ?vest_nr ;
92            onz-g:hasLocalizableArea/onz-g:identifiedBy/onz-g:hasPart/onz-g:hasPart ?postcode_6 .
93            ?vest_nr a onz-org:Vestigingsnummer ;
94            onz-g:hasDataValue ?vestiging .
95
96            BIND( IRI(SUBSTR(STR(?postcode_6), 1, STRLEN(STR(?postcode_6)) - 2)) AS ?postcode )
97            ?pc_gebied onz-g:identifiedBy ?postcode ;
98            onz-g:partOf+ ?zk_regio .
99        }
100        UNION
101        {
102            # Tak 2: totaal organisatie, laat zorgkantoorregio leeg
103            ?vestiging_uri onz-org:vestigingVan ?organisatie_uri .
104            BIND("Totaal organisatie" AS ?vestiging)
105        }
106
107        # ---- Kalender: maanden (max 12) ----
108        # Jaar-start numeriek (1 jan)
109        BIND(xsd:date(CONCAT(STR(?jaar), "-01-01")) AS ?jan1)
110        ?jan1 ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?jan1_num .
111
112        # Schrikkeljaar (gregoriaans)
113        BIND(xsd:integer(?jaar) AS ?y)
114        BIND( xsd:integer(?y - (400 * FLOOR(?y / 400))) AS ?r400 )
115        BIND( xsd:integer(?y - (  4 * FLOOR(?y /   4))) AS ?r4   )
116        BIND( xsd:integer(?y - (100 * FLOOR(?y / 100))) AS ?r100 )
117        BIND( ( (?r400 = 0) || ( (?r4 = 0) && (?r100 != 0) ) ) AS ?isSchrikkel )
118        BIND(IF(?isSchrikkel, 1, 0) AS ?schrikkelAdd)
119
120        # Maanden 1..12 met start/eind dag-in-jaar (baseline is een niet schikkeljaar '_ns')
121        VALUES (?maand ?start_dag_ns ?eind_dag_ns){
122            (1  1   31)   # januari   31 dagen
123            (2  32  59)   # februari  28/29 dagen
124            (3  60  90)   # maart     31 dagen
125            (4  91  120)  # april     30 dagen
126            (5  121 151)  # mei       31 dagen
127            (6  152 181)  # juni      30 dagen
128            (7  182 212)  # juli      31 dagen
129            (8  213 243)  # augustus  31 dagen
130            (9  244 273)  # september 30 dagen
131            (10 274 304)  # oktober   31 dagen
132            (11 305 334)  # november  30 dagen
133            (12 335 365)  # december  31 dagen
134        }
135
136        # Corrigeer dagen voor schrikkeljaar (alle maanden na februari +1 dag)
137        BIND(?start_dag_ns + IF(?maand > 2, ?schrikkelAdd, 0) AS ?start_dag)
138        BIND(?eind_dag_ns + IF(?maand > 2, ?schrikkelAdd, 0) AS ?eind_dag)
139
140        # Maand start/eind numeriek
141        BIND(?jan1_num + (?start_dag - 1) AS ?maand_start_num)
142        BIND(?jan1_num + (?eind_dag - 1) AS ?maand_eind_num)
143
144        # Houd alleen maanden die in de periode vallen
145        FILTER(?maand_eind_num >= ?start_periode_numeriek && ?maand_start_num <= ?eind_periode_numeriek)
146
147        # Unieke maand-id (voor DISTINCT)
148        BIND(CONCAT(STR(?jaar), "-", IF(?maand < 10, CONCAT("0", STR(?maand)), STR(?maand))) AS ?maand_id)
149
150        # # ---- Maand binnen deze afspraak? Zo ja, tel voor de juiste categorie ----
151        ?start_afspraak_corr ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?start_num .
152        ?eind_afspraak_corr  ^time:inXSDDate/time:inTemporalPosition/time:numericPosition ?end_num .
153
154        # ---- Overlap: afspraak overlapt maand? ----
155        FILTER(?start_num <= ?maand_eind_num && ?end_num >= ?maand_start_num)
156
157        # DISTINCT in de COUNT voorkomt dubbeltelling bij overlap op dezelfde dag
158        BIND(IF(?zorg_boolean = 1, ?maand_id, ?unbound) AS ?maand_id_zorg)
159        BIND(IF(?zorg_boolean = 0, ?maand_id, ?unbound) AS ?maand_id_nietzorg)
160      }
161      GROUP BY ?Periode ?vestiging ?persoon ?maanden_periode
162    }
163  }
164  GROUP BY ?Periode ?vestiging ?persoon ?maanden_periode
165}
166GROUP BY ?Periode ?vestiging
167ORDER BY ?Periode ?vestiging
168