SELECT
CASE
WHEN d.Calculated_Age < 20 THEN '<20'
WHEN d.Calculated_Age BETWEEN 20 AND 29 THEN '20-29'
WHEN d.Calculated_Age BETWEEN 30 AND 39 THEN '30-39'
WHEN d.Calculated_Age BETWEEN 40 AND 49 THEN '40-49'
WHEN d.Calculated_Age BETWEEN 50 AND 59 THEN '50-59'
WHEN d.Calculated_Age BETWEEN 60 AND 69 THEN '60-69'
WHEN d.Calculated_Age BETWEEN 70 AND 79 THEN '70-79'
ELSE '80+'
END AS AgeGroup,
i.Approved_Name,
COUNT(*) AS PrescriptionCount
FROM Project_12345..Prescribing_Scripts s
INNER JOIN Project_12345..Prescribing_Scripts_Prescribing_Item i
ON s.hic_drugID = i.hic_drugID
INNER JOIN Project_12345..Demography_Current d
ON s.PROCHI = d.PROCHI
GROUP BY
CASE
WHEN d.Calculated_Age < 20 THEN '<20'
WHEN d.Calculated_Age BETWEEN 20 AND 29 THEN '20-29'
WHEN d.Calculated_Age BETWEEN 30 AND 39 THEN '30-39'
WHEN d.Calculated_Age BETWEEN 40 AND 49 THEN '40-49'
WHEN d.Calculated_Age BETWEEN 50 AND 59 THEN '50-59'
WHEN d.Calculated_Age BETWEEN 60 AND 69 THEN '60-69'
WHEN d.Calculated_Age BETWEEN 70 AND 79 THEN '70-79'
ELSE '80+'
END,
i.Approved_Name
ORDER BY PrescriptionCount DESC
with engine.connect() as conn:
scripts = pd.read_sql("""
SELECT s.PROCHI, s.hic_drugID
FROM Project_12345..Prescribing_Scripts s
""", conn)
items = pd.read_sql("""
SELECT hic_drugID, Approved_Name
FROM Project_12345..Prescribing_Scripts_Prescribing_Item
""", conn)
demog = pd.read_sql("""
SELECT PROCHI, Calculated_Age
FROM Project_12345..Demography_Current
""", conn)
# Merge the three tables
df = scripts.merge(items, on="hic_drugID").merge(demog, on="PROCHI")
# Create age bands in 10-year intervals
bins = [0, 20, 30, 40, 50, 60, 70, 80, 200]
labels = ["<20", "20-29", "30-39", "40-49", "50-59", "60-69", "70-79", "80+"]
df["AgeGroup"] = pd.cut(df["Calculated_Age"], bins=bins, labels=labels, right=False)
# Count prescription records per age group and drug
result = (df.groupby(["AgeGroup", "Approved_Name"])
.size()
.reset_index(name="PrescriptionCount")
.sort_values("PrescriptionCount", ascending=False))
result
# Load all three tables
scripts <- dbGetQuery(conn, "
SELECT PROCHI, hic_drugID
FROM Project_12345..Prescribing_Scripts
")
items <- dbGetQuery(conn, "
SELECT hic_drugID, Approved_Name
FROM Project_12345..Prescribing_Scripts_Prescribing_Item
")
demog <- dbGetQuery(conn, "
SELECT PROCHI, Calculated_Age
FROM Project_12345..Demography_Current
")
# Merge and create age bands
df <- merge(merge(scripts, items, by = "hic_drugID"), demog, by = "PROCHI")
df$AgeGroup <- cut(df$Calculated_Age,
breaks = c(0, 20, 30, 40, 50, 60, 70, 80, Inf),
labels = c("<20", "20-29", "30-39", "40-49",
"50-59", "60-69", "70-79", "80+"),
right = FALSE)
# Count prescription records
result <- aggregate(hic_drugID ~ AgeGroup + Approved_Name, data = df, FUN = length)
names(result)[3] <- "PrescriptionCount"
result <- result[order(-result$PrescriptionCount), ]
head(result, 20)