-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPharma.sql
More file actions
298 lines (225 loc) · 6.61 KB
/
Pharma.sql
File metadata and controls
298 lines (225 loc) · 6.61 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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
create database pharma;
-- Pharmaceutical Manufacturing Process Analytics using SQL Server
-- Check NULL Values
SELECT
COUNT(*) AS TotalRows,
SUM(CASE WHEN Humidity IS NULL THEN 1 ELSE 0 END) AS Humidity_Nulls
FROM Pharma_Process;
-- Full column-level NULL audit
SELECT
SUM(CASE WHEN BatchID IS NULL THEN 1 ELSE 0 END) AS BatchID_Null,
SUM(CASE WHEN ProductName IS NULL THEN 1 ELSE 0 END) AS ProductName_Null,
SUM(CASE WHEN Stage IS NULL THEN 1 ELSE 0 END) AS Stage_Null,
SUM(CASE WHEN InputWeight_kg IS NULL THEN 1 ELSE 0 END) AS Input_Null,
SUM(CASE WHEN OutputWeight_kg IS NULL THEN 1 ELSE 0 END) AS Output_Null,
SUM(CASE WHEN Duration_hr IS NULL THEN 1 ELSE 0 END) AS Duration_Null,
SUM(CASE WHEN RoomTemp_C IS NULL THEN 1 ELSE 0 END) AS Temp_Null,
SUM(CASE WHEN Humidity IS NULL THEN 1 ELSE 0 END) AS Humidity_Null
FROM Pharma_Process;
-- Handle NULL Humidity (Replace with Stage-wise average)
UPDATE p
SET Humidity = avg_tbl.avg_humidity
FROM Pharma_Process p
JOIN (
SELECT Stage, AVG(Humidity) AS avg_humidity
FROM Pharma_Process
WHERE Humidity IS NOT NULL
GROUP BY Stage
) avg_tbl
ON p.Stage = avg_tbl.Stage
WHERE p.Humidity IS NULL;
-- BASIC SQL QUERIES
SELECT * FROM Pharma_Process;
-- 1. Unique products
SELECT DISTINCT ProductName FROM Pharma_Process;
-- INTERMEDIATE
-- 2. Yield Loss Calculation
SELECT
BatchID,
ProductName,
Stage,
InputWeight_kg,
OutputWeight_kg,
(InputWeight_kg - OutputWeight_kg) AS Weight_Loss_kg
FROM Pharma_Process;
-- 3. Average Loss by Stage
SELECT
Stage,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss_kg
FROM Pharma_Process
GROUP BY Stage;
-- 4. Deviation Count per Product
SELECT
ProductName,
COUNT(*) AS Deviation_Count
FROM Pharma_Process
WHERE DeviationType <> 'Normal run'
GROUP BY ProductName;
-- ADVANCED
select * from Pharma_Process
-- 5. Yield Percentage
SELECT
BatchID,
Stage,
ROUND((OutputWeight_kg / InputWeight_kg) * 100, 2) AS Yield_Percentage
FROM Pharma_Process;
-- 6. Worst Performing Machines
SELECT
MachineID,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss
FROM Pharma_Process
GROUP BY MachineID
ORDER BY Avg_Loss DESC;
-- 7. Operator Performance (Deviation Impact)
SELECT
Operator,
COUNT(*) AS Total_Operations,
SUM(CASE WHEN DeviationType <> 'Normal run' THEN 1 ELSE 0 END) AS Deviations
FROM Pharma_Process
GROUP BY Operator;
-- 8. Environmental Impact Analysis
SELECT
Stage,
AVG(RoomTemp_C) AS Avg_Temp,
AVG(Humidity) AS Avg_Humidity,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss
FROM Pharma_Process
GROUP BY Stage;
-- 9. Which batch–stage combination has the highest material loss %?
-- (Tests: arithmetic logic + business understanding)
SELECT
BatchID,
ProductName,
Stage,
ROUND(((InputWeight_kg - OutputWeight_kg) / InputWeight_kg) * 100, 2) AS Loss_Percentage
FROM Pharma_Process
ORDER BY Loss_Percentage DESC;
--10. Identify products with inconsistent yield (high variance)
SELECT
ProductName,
VAR(InputWeight_kg - OutputWeight_kg) AS Loss_Variance
FROM Pharma_Process
GROUP BY ProductName
ORDER BY Loss_Variance DESC;
-- PROCESS & QUALITY CONTROL QUESTIONS
-- 11. Which deviation types cause maximum loss?
-- (Quality + root cause analysis)
SELECT
DeviationType,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss
FROM Pharma_Process
WHERE DeviationType IS NOT NULL
GROUP BY DeviationType
ORDER BY Avg_Loss DESC;
-- 12. Find machines responsible for repeated deviations.
SELECT
MachineID,
COUNT(*) AS Deviation_Count
FROM Pharma_Process
WHERE DeviationType <> 'Normal run'
GROUP BY MachineID
HAVING COUNT(*) > 1;
-- EXPERT
select * from Pharma_Process;
-- 13. Rank batches by efficiency
SELECT *,
RANK() OVER (ORDER BY (OutputWeight_kg / InputWeight_kg) DESC) AS Efficiency_Rank
FROM Pharma_Process;
-- ENVIRONMENT & SENSOR DATA QUESTIONS
-- 14. Does high humidity lead to higher loss?
SELECT
CASE
WHEN Humidity < 45 THEN 'Low Humidity'
WHEN Humidity BETWEEN 45 AND 55 THEN 'Normal Humidity'
ELSE 'High Humidity'
END AS Humidity_Level,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss
FROM Pharma_Process
GROUP BY
CASE
WHEN Humidity < 45 THEN 'Low Humidity'
WHEN Humidity BETWEEN 45 AND 55 THEN 'Normal Humidity'
ELSE 'High Humidity'
END;
-- 15. Identify outlier batches (loss > 1.5× stage average)
-- Outlier detection using pure SQL
WITH stage_avg AS (
SELECT Stage, AVG(InputWeight_kg - OutputWeight_kg) AS avg_loss
FROM Pharma_Process
GROUP BY Stage
)
SELECT p.*
FROM Pharma_Process p
JOIN stage_avg s ON p.Stage = s.Stage
WHERE (p.InputWeight_kg - p.OutputWeight_kg) > 1.5 * s.avg_loss;
-- WINDOW FUNCTION
-- 16. Rank operators within each stage by efficiency (PARTITION BY)
SELECT
Stage,
Operator,
ROUND((OutputWeight_kg / InputWeight_kg) * 100, 2) AS Yield_Percentage,
RANK() OVER (PARTITION BY Stage ORDER BY (OutputWeight_kg / InputWeight_kg) DESC) AS Rank_In_Stage
FROM Pharma_Process;
-- 17. Detect process drift over time
SELECT
Stage,
MONTH(Date) AS Month,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss
FROM Pharma_Process
GROUP BY Stage, MONTH(Date)
ORDER BY Stage, Month;
-- 18. Create a KPI-ready view for dashboards
-- Power BI / Tableau integration mindset
CREATE VIEW Manufacturing_KPIs AS
SELECT
ProductName,
Stage,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss,
AVG((OutputWeight_kg / InputWeight_kg) * 100) AS Avg_Yield
FROM Pharma_Process
GROUP BY ProductName, Stage;
SELECT *
FROM Manufacturing_KPIs;
-- Filter the VIEW
-- only Coating stage
SELECT *
FROM Manufacturing_KPIs
WHERE Stage = 'Coating';
-- Sort the results
SELECT *
FROM Manufacturing_KPIs
ORDER BY Avg_Loss DESC;
-- Use the VIEW in JOINs (join KPI view with raw data)
SELECT
p.BatchID,
p.Operator,
v.ProductName,
v.Stage,
v.Avg_Loss,
v.Avg_Yield
FROM Pharma_Process p
JOIN Manufacturing_KPIs v
ON p.ProductName = v.ProductName
AND p.Stage = v.Stage;
-- See the VIEW definition
EXEC sp_helptext 'Manufacturing_KPIs';
-- MATERIALIZED KPI TABLE
-- Instead of a dynamic view, create a physical KPI table:
SELECT
ProductName,
Stage,
AVG(InputWeight_kg - OutputWeight_kg) AS Avg_Loss,
AVG((OutputWeight_kg / InputWeight_kg) * 100) AS Avg_Yield
INTO Pharma_KPI_Snapshot
FROM Pharma_Process
GROUP BY ProductName, Stage;
-- ML-ready features
CREATE VIEW ML_Features AS
SELECT
BatchID,
Stage,
(InputWeight_kg - OutputWeight_kg) AS Loss_kg,
(OutputWeight_kg / InputWeight_kg) * 100 AS Yield_pct,
RoomTemp_C,
Humidity
FROM Pharma_Process;