-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path07_create_reporting_model.sql
More file actions
190 lines (181 loc) · 5.57 KB
/
Copy path07_create_reporting_model.sql
File metadata and controls
190 lines (181 loc) · 5.57 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
USE dpa_training;
GO
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
SET XACT_ABORT ON;
GO
IF NOT EXISTS (
SELECT 1
FROM sys.schemas
WHERE name = N'reporting'
)
BEGIN
EXEC(N'CREATE SCHEMA reporting');
END;
GO
IF OBJECT_ID(N'reporting.dim_module', N'U') IS NULL
BEGIN
CREATE TABLE reporting.dim_module (
module_key INT IDENTITY(1,1) NOT NULL,
source_module_id INT NOT NULL,
module_code NVARCHAR(20) NOT NULL,
module_name NVARCHAR(100) NOT NULL,
topic_area NVARCHAR(100) NOT NULL,
CONSTRAINT PK_reporting_dim_module
PRIMARY KEY (module_key),
CONSTRAINT UQ_reporting_dim_module_source
UNIQUE (source_module_id),
CONSTRAINT UQ_reporting_dim_module_code
UNIQUE (module_code),
CONSTRAINT CK_reporting_dim_module_required_text CHECK (
LEN(LTRIM(RTRIM(module_code))) > 0
AND LEN(LTRIM(RTRIM(module_name))) > 0
AND LEN(LTRIM(RTRIM(topic_area))) > 0
)
);
END;
GO
IF OBJECT_ID(N'reporting.dim_learner', N'U') IS NULL
BEGIN
CREATE TABLE reporting.dim_learner (
learner_key INT IDENTITY(1,1) NOT NULL,
source_learner_id INT NOT NULL,
learner_code NVARCHAR(20) NOT NULL,
learner_name NVARCHAR(100) NOT NULL,
CONSTRAINT PK_reporting_dim_learner
PRIMARY KEY (learner_key),
CONSTRAINT UQ_reporting_dim_learner_source
UNIQUE (source_learner_id),
CONSTRAINT UQ_reporting_dim_learner_code
UNIQUE (learner_code),
CONSTRAINT CK_reporting_dim_learner_required_text CHECK (
LEN(LTRIM(RTRIM(learner_code))) > 0
AND LEN(LTRIM(RTRIM(learner_name))) > 0
)
);
END;
GO
IF OBJECT_ID(N'reporting.dim_assessment', N'U') IS NULL
BEGIN
CREATE TABLE reporting.dim_assessment (
assessment_key INT IDENTITY(1,1) NOT NULL,
source_assessment_id INT NOT NULL,
assessment_name NVARCHAR(100) NOT NULL,
assessment_date DATE NOT NULL,
CONSTRAINT PK_reporting_dim_assessment
PRIMARY KEY (assessment_key),
CONSTRAINT UQ_reporting_dim_assessment_source
UNIQUE (source_assessment_id),
CONSTRAINT CK_reporting_dim_assessment_required_text CHECK (
LEN(LTRIM(RTRIM(assessment_name))) > 0
)
);
END;
GO
IF OBJECT_ID(N'reporting.fact_assessment_result', N'U') IS NULL
BEGIN
CREATE TABLE reporting.fact_assessment_result (
assessment_result_key BIGINT IDENTITY(1,1) NOT NULL,
source_result_id INT NOT NULL,
module_key INT NOT NULL,
learner_key INT NOT NULL,
assessment_key INT NOT NULL,
score DECIMAL(5,2) NOT NULL,
max_score DECIMAL(5,2) NOT NULL,
pass_score DECIMAL(5,2) NOT NULL,
score_percentage AS (
CAST(
100.0 * score / NULLIF(max_score, 0)
AS DECIMAL(7,2)
)
) PERSISTED,
passed AS (
CAST(
CASE WHEN score >= pass_score THEN 1 ELSE 0 END
AS bit
)
) PERSISTED,
loaded_at_utc DATETIME2(0) NOT NULL
CONSTRAINT DF_reporting_fact_loaded_at_utc
DEFAULT SYSUTCDATETIME(),
CONSTRAINT PK_reporting_fact_assessment_result
PRIMARY KEY (assessment_result_key),
CONSTRAINT UQ_reporting_fact_source_result
UNIQUE (source_result_id),
CONSTRAINT UQ_reporting_fact_grain
UNIQUE (assessment_key, learner_key),
CONSTRAINT FK_reporting_fact_module
FOREIGN KEY (module_key)
REFERENCES reporting.dim_module(module_key),
CONSTRAINT FK_reporting_fact_learner
FOREIGN KEY (learner_key)
REFERENCES reporting.dim_learner(learner_key),
CONSTRAINT FK_reporting_fact_assessment
FOREIGN KEY (assessment_key)
REFERENCES reporting.dim_assessment(assessment_key),
CONSTRAINT CK_reporting_fact_score_values CHECK (
max_score > 0
AND pass_score >= 0
AND pass_score <= max_score
AND score >= 0
AND score <= max_score
)
);
END;
GO
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'reporting.fact_assessment_result')
AND name = N'IX_reporting_fact_module_key'
)
BEGIN
CREATE INDEX IX_reporting_fact_module_key
ON reporting.fact_assessment_result (module_key)
INCLUDE (score, score_percentage, passed);
END;
GO
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'reporting.fact_assessment_result')
AND name = N'IX_reporting_fact_learner_key'
)
BEGIN
CREATE INDEX IX_reporting_fact_learner_key
ON reporting.fact_assessment_result (learner_key)
INCLUDE (score, score_percentage, passed);
END;
GO
CREATE OR ALTER VIEW reporting.v_assessment_result_detail
AS
SELECT
f.assessment_result_key,
f.source_result_id,
m.module_code,
m.module_name,
m.topic_area,
a.source_assessment_id,
a.assessment_name,
a.assessment_date,
l.learner_code,
l.learner_name,
f.score,
f.max_score,
f.pass_score,
f.score_percentage,
f.passed,
f.loaded_at_utc
FROM reporting.fact_assessment_result f
JOIN reporting.dim_module m
ON m.module_key = f.module_key
JOIN reporting.dim_learner l
ON l.learner_key = f.learner_key
JOIN reporting.dim_assessment a
ON a.assessment_key = f.assessment_key;
GO