Beste Tweakers,
Helaas moet ik jullie weer een vraagstellen omdat ik vastloop om een query (VIEW) goed te krijgen. De situatie is als volgt. Ik heb 2 tabellen (persons en employments). In persons staan alle medewerkers en in employments staan de personeelsnummers met de contracten die zij hebben.
Nu ben ik bezig met het schrijven van een VIEW, deze VIEW moet de juiste data laten zien, dit omdat de tool die dit in gaat lezen niet de mogelijkheid heeft om nog te filteren/loopen etc op de data.
In de VIEW moet staan:
Wat moet het resultaat zijn:/f/image/Nppt7qwgjDYKym1UmsNyISPu.png?f=fotoalbum_large)
/f/image/XahnbGVAA68SbDWM9R0UH2Tx.png?f=fotoalbum_large)
/f/image/9Z7wQefAe2osvJkj0Hz13Iu0.png?f=fotoalbum_large)
Zoals je ziet bij de Query screenshot, krijg ik de einddatum mee van het contract met de einddatum die het het verst in de toekomst ligt. Dit terwijl het eigenlijk NULL moet zijn (in hoe ik het nodig heb)
Ik heb het script samen gemaakt met een collega maar ook hij komt hier niet uit.
De query:
Mogelijk kan de SQL code korter en netter, maar mijn kennis van SQL is niet heel goed. Het liefst had ik hiervoor een php middleware script geschreven, aangezien ik dan de data via loops had kunnen ophalen.
Helaas moet ik jullie weer een vraagstellen omdat ik vastloop om een query (VIEW) goed te krijgen. De situatie is als volgt. Ik heb 2 tabellen (persons en employments). In persons staan alle medewerkers en in employments staan de personeelsnummers met de contracten die zij hebben.
Nu ben ik bezig met het schrijven van een VIEW, deze VIEW moet de juiste data laten zien, dit omdat de tool die dit in gaat lezen niet de mogelijkheid heeft om nog te filteren/loopen etc op de data.
In de VIEW moet staan:
- person_id
- person_code
- is_manager
- manager_person_id
- gender
- initials
- first_name
- last_name
- last_name_prefix
- phone_business
- phone_mobile
- email_business
- hours_per_week
- company
- department
- job_title
- StartDate
- EndDate
Wat moet het resultaat zijn:
- Als een medewerker een contract heeft die de volgende dag ingaat, dan moet de EndDatum verlengt worden met de Einddatum ( date_employed_to) van dat contract
- Als er langer dan 1 dag tussen zit maar de medewerker is nog uitdienst, dan moet de toekomstige contract genegeerd worden
- Als date_employed_to een null weergeeft dan heeft dat contract geen einddatum en dan moet DateEnd dus ook null zijn.
Nu een aantal screenshots:
Tabel persons:
/f/image/Nppt7qwgjDYKym1UmsNyISPu.png?f=fotoalbum_large)
De Contracten
/f/image/XahnbGVAA68SbDWM9R0UH2Tx.png?f=fotoalbum_large)
Resultaat van de nu Query
/f/image/9Z7wQefAe2osvJkj0Hz13Iu0.png?f=fotoalbum_large)
Zoals je ziet bij de Query screenshot, krijg ik de einddatum mee van het contract met de einddatum die het het verst in de toekomst ligt. Dit terwijl het eigenlijk NULL moet zijn (in hoe ik het nodig heb)
Ik heb het script samen gemaakt met een collega maar ook hij komt hier niet uit.
De query:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| WITH employments_cte AS ( /* Haalt de contract data op (employments) en controleert of het contract al gestart is, in de toekomst ligt of dat er een volgend contract is (geschreven door collega).*/ Select e.person_id, max(e.date_employed_to) as date_employed_to, min(e.date_employed_from) as date_employed_from From employments e Where (e.date_employed_from <= convert(date, getdate()) and e.date_employed_to > convert(date, getdate())) OR e.date_employed_to IS NULL OR e.date_employed_from = convert(date, DATEADD(day, 1, getdate())) Group By e.person_id UNION ALL Select e.person_id, e.date_employed_to as date_employed_to, e.date_employed_from From employments e inner join employments_cte ec ON (e.person_id = ec.person_id) Where (e.date_employed_from <= ec.date_employed_to and e.date_employed_to > ec.date_employed_to ) ), employments_cte_dates AS ( /* Bundelt alle contracten van een medewerker bij elkaar */ Select c.person_id, min(c.date_employed_from) As StartDate, max(c.date_employed_to) as EndDate From employments_cte AS c Group by c.person_id ), hoofdfunctie as ( /* Haalt de functie op waarbij je de meeste uren werkt en maakt daar RowID 1 van.*/ SELECT b.person_id AS personeelsnummer, b.employment_id, b.date_employed_from, b.date_employed_to, b.hours_per_week, b.working_days, b.company_id, b.company, b.department_id, b.department, b.cost_center_id, b.cost_center, b.job_title_id, b.job_title, b.manager_person_id, b.date_last_working_day, ROW_NUMBER() OVER (PARTITION BY b.person_id ORDER BY b.hours_per_week DESC) AS RowID FROM dbo.employments AS b WHERE (b.date_employed_to IS NULL) OR (b.date_employed_to >= GETDATE()) ) /* Toont het resultaat en pakt RowID=1 (hoofdcontract).*/ Select E.person_id,person_code,is_manager,manager_person_id,gender,initials,first_name,last_name,last_name_prefix, phone_business,phone_mobile,email_business, hours_per_week,company, department, job_title, StartDate, EndDate FROM employments_cte_dates AS E INNER JOIN dbo.persons AS P ON P.person_id = E.person_id INNER JOIN hoofdfunctie AS HF ON HF.personeelsnummer = E.person_id WHERE ((e.EndDate IS NULL) OR (e.EndDate >= GETDATE())) AND hf.RowID = 1 AND e.person_id = 1 |
Mogelijk kan de SQL code korter en netter, maar mijn kennis van SQL is niet heel goed. Het liefst had ik hiervoor een php middleware script geschreven, aangezien ik dan de data via loops had kunnen ophalen.
SQL tabellen
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| CREATE TABLE [dbo].[persons]( [person_id] [int] NOT NULL, [person_code] [varchar](255) NULL, [initials] [varchar](255) NULL, [first_name] [varchar](255) NULL, [last_name] [varchar](255) NULL, [last_name_prefix] [varchar](255) NULL, [gender] [char](1) NULL, [is_manager] [bit] NOT NULL, [phone_business] [varchar](255) NULL, [phone_mobile] [varchar](255) NULL, [email_business] [varchar](255) NULL, CONSTRAINT [PK_persons] PRIMARY KEY CLUSTERED ( [person_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| CREATE TABLE [dbo].[employments]( [person_id] [int] NOT NULL, [employment_id] [int] NOT NULL, [date_employed_from] [date] NULL, [date_employed_to] [date] NULL, [hours_per_week] [numeric](5, 2) NOT NULL, [working_days] [varchar](255) NULL, [company_id] [int] NOT NULL, [company] [varchar](255) NULL, [department_id] [int] NOT NULL, [department] [varchar](255) NULL, [cost_center_id] [varchar](7) NULL, [cost_center] [varchar](255) NULL, [job_title_id] [varchar](10) NULL, [job_title] [varchar](255) NULL, [manager_person_id] [int] NULL, [date_last_working_day] [date] NULL, CONSTRAINT [PK_employments] PRIMARY KEY CLUSTERED ( [person_id] ASC, [employment_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| CREATE VIEW [dbo].[vw_medewerkers] AS WITH employments_cte AS ( /* Haalt de contract data op (employments) en controleert of het contract al gestart is, in de toekomst ligt of dat er een volgend contract is (geschreven door collega).*/ Select e.person_id, max(e.date_employed_to) as date_employed_to, min(e.date_employed_from) as date_employed_from From employments e Where (e.date_employed_from <= convert(date, getdate()) and e.date_employed_to > convert(date, getdate())) OR e.date_employed_to IS NULL OR e.date_employed_from = convert(date, DATEADD(day, 1, getdate())) Group By e.person_id UNION ALL Select e.person_id, e.date_employed_to as date_employed_to, e.date_employed_from From employments e inner join employments_cte ec ON (e.person_id = ec.person_id) Where (e.date_employed_from <= ec.date_employed_to and e.date_employed_to > ec.date_employed_to ) ), employments_cte_dates AS ( /* Bundelt alle contracten van een medewerker bij elkaar */ Select c.person_id, min(c.date_employed_from) As StartDate, max(c.date_employed_to) as EndDate From employments_cte AS c Group by c.person_id ), hoofdfunctie as ( /* Haalt de functie op waarbij je de meeste uren werkt en maakt daar RowID 1 van.*/ SELECT b.person_id AS personeelsnummer, b.employment_id, b.date_employed_from, b.date_employed_to, b.hours_per_week, b.working_days, b.company_id, b.company, b.department_id, b.department, b.cost_center_id, b.cost_center, b.job_title_id, b.job_title, b.manager_person_id, b.date_last_working_day, ROW_NUMBER() OVER (PARTITION BY b.person_id ORDER BY b.hours_per_week DESC) AS RowID FROM dbo.employments AS b WHERE (b.date_employed_to IS NULL) OR (b.date_employed_to >= GETDATE()) ) /* Toont het resultaat en pakt RowID=1 (hoofdcontract).*/ Select E.person_id,person_code,is_manager,manager_person_id,gender,initials,first_name,last_name,last_name_prefix, phone_business,phone_mobile,email_business, hours_per_week,company, department, job_title, StartDate, EndDate FROM employments_cte_dates AS E INNER JOIN dbo.persons AS P ON P.person_id = E.person_id INNER JOIN hoofdfunctie AS HF ON HF.personeelsnummer = E.person_id WHERE ((e.EndDate IS NULL) OR (e.EndDate >= GETDATE())) AND hf.RowID = 1 AND e.person_id = 1 GO |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (1, 1, CAST(N'2023-12-01' AS Date), NULL, CAST(10.00 AS Numeric(5, 2)), N'100000', 1, N'prive', 1, N'ICT', N'123', N'test', N'2', N'TESTER', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (1, 2, CAST(N'2023-12-07' AS Date), NULL, CAST(10.00 AS Numeric(5, 2)), N'011110', 1, N'prive', 1, N'FD', N'123', N'FD', N'2', N'Huismeester', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (1, 3, CAST(N'2023-12-07' AS Date), CAST(N'2024-05-01' AS Date), CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'ICT', N'2', N'Applicatiebeheer', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (1, 4, CAST(N'2021-01-07' AS Date), CAST(N'2024-05-01' AS Date), CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'ICT', N'2', N'TESTER', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (1, 5, CAST(N'2024-01-07' AS Date), CAST(N'2024-05-01' AS Date), CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'ICT', N'2', N'TESTER', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (2, 1, CAST(N'2021-01-07' AS Date), CAST(N'2021-05-01' AS Date), CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'ICT', N'2', N'TESTER', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (2, 2, CAST(N'2024-01-01' AS Date), NULL, CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'FB', N'2', N'Receptie', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (3, 1, CAST(N'2023-01-01' AS Date), CAST(N'2023-05-01' AS Date), CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'FB', N'2', N'Receptie', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (3, 2, CAST(N'2023-05-01' AS Date), CAST(N'2023-12-06' AS Date), CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'FB', N'2', N'Receptie 2', 1, NULL) GO INSERT [dbo].[employments] ([person_id], [employment_id], [date_employed_from], [date_employed_to], [hours_per_week], [working_days], [company_id], [company], [department_id], [department], [cost_center_id], [cost_center], [job_title_id], [job_title], [manager_person_id], [date_last_working_day]) VALUES (3, 3, CAST(N'2023-12-10' AS Date), CAST(N'2024-12-01' AS Date), CAST(10.00 AS Numeric(5, 2)), N'000001', 1, N'prive', 1, N'AB', N'123', N'FB', N'2', N'Receptie 3', 1, NULL) GO INSERT [dbo].[persons] ([person_id], [person_code], [initials], [first_name], [last_name], [last_name_prefix], [gender], [is_manager], [phone_business], [phone_mobile], [email_business]) VALUES (1, N'ABC', N'J', N'Jo', N'VE', NULL, N'M', 0, NULL, NULL, NULL) GO INSERT [dbo].[persons] ([person_id], [person_code], [initials], [first_name], [last_name], [last_name_prefix], [gender], [is_manager], [phone_business], [phone_mobile], [email_business]) VALUES (2, N'ABC', N'J', N'Dum', N'MY', NULL, N'M', 0, NULL, NULL, NULL) GO INSERT [dbo].[persons] ([person_id], [person_code], [initials], [first_name], [last_name], [last_name_prefix], [gender], [is_manager], [phone_business], [phone_mobile], [email_business]) VALUES (3, N'ABC', N'J', N'Oud', N'MDW', NULL, N'M', 0, NULL, NULL, NULL) GO |
[ Voor 65% gewijzigd door Jboy1991 op 06-12-2023 21:52 ]