From 762086f6ab0a3344bdb2143f169408b8a0d95d30 Mon Sep 17 00:00:00 2001 From: Andrei Date: Wed, 8 Oct 2025 11:06:19 +0000 Subject: [PATCH] fix: Correct column names in analytics SQL queries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed getAgeDistribution: use CTE with sort_order to avoid column reference errors - Fixed getEngagementPattern: changed user_id to logged_by and created_at to started_at - Fixed getActivityByDay: changed created_at to started_at throughout All queries now match the actual database schema. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../admin/dashboard/dashboard.service.ts | 73 ++++++++++--------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/maternal-app/maternal-app-backend/src/modules/admin/dashboard/dashboard.service.ts b/maternal-app/maternal-app-backend/src/modules/admin/dashboard/dashboard.service.ts index c0620ff..682740d 100644 --- a/maternal-app/maternal-app-backend/src/modules/admin/dashboard/dashboard.service.ts +++ b/maternal-app/maternal-app-backend/src/modules/admin/dashboard/dashboard.service.ts @@ -131,14 +131,14 @@ export class DashboardService { async getActivityByDay(days: number = 7) { const result = await this.userRepository.query( `SELECT - TO_CHAR(created_at, 'Day') as day, + TO_CHAR(started_at, 'Day') as day, SUM(CASE WHEN type = 'feeding' THEN 1 ELSE 0 END) as feeding, SUM(CASE WHEN type = 'sleep' THEN 1 ELSE 0 END) as sleep, SUM(CASE WHEN type = 'diaper' THEN 1 ELSE 0 END) as diapers FROM activities - WHERE created_at >= NOW() - INTERVAL '${days} days' - GROUP BY TO_CHAR(created_at, 'Day'), EXTRACT(DOW FROM created_at) - ORDER BY EXTRACT(DOW FROM created_at)`, + WHERE started_at >= NOW() - INTERVAL '${days} days' + GROUP BY TO_CHAR(started_at, 'Day'), EXTRACT(DOW FROM started_at) + ORDER BY EXTRACT(DOW FROM started_at)`, ); return result.map((row: any) => ({ @@ -151,33 +151,36 @@ export class DashboardService { async getAgeDistribution() { const result = await this.userRepository.query( - `SELECT - CASE - WHEN age_months BETWEEN 0 AND 5 THEN '0-6 months' - WHEN age_months BETWEEN 6 AND 11 THEN '6-12 months' - WHEN age_months BETWEEN 12 AND 23 THEN '1-2 years' - WHEN age_months BETWEEN 24 AND 35 THEN '2-3 years' - WHEN age_months BETWEEN 36 AND 47 THEN '3-4 years' - WHEN age_months BETWEEN 48 AND 59 THEN '4-5 years' - ELSE '5-6 years' - END as age, - COUNT(*) as count - FROM ( - SELECT EXTRACT(YEAR FROM AGE(birth_date)) * 12 + EXTRACT(MONTH FROM AGE(birth_date)) as age_months - FROM children - WHERE birth_date IS NOT NULL AND deleted_at IS NULL - ) ages - GROUP BY age - ORDER BY - CASE age - WHEN '0-6 months' THEN 1 - WHEN '6-12 months' THEN 2 - WHEN '1-2 years' THEN 3 - WHEN '2-3 years' THEN 4 - WHEN '3-4 years' THEN 5 - WHEN '4-5 years' THEN 6 - ELSE 7 - END`, + `WITH age_groups AS ( + SELECT + CASE + WHEN age_months BETWEEN 0 AND 5 THEN '0-6 months' + WHEN age_months BETWEEN 6 AND 11 THEN '6-12 months' + WHEN age_months BETWEEN 12 AND 23 THEN '1-2 years' + WHEN age_months BETWEEN 24 AND 35 THEN '2-3 years' + WHEN age_months BETWEEN 36 AND 47 THEN '3-4 years' + WHEN age_months BETWEEN 48 AND 59 THEN '4-5 years' + ELSE '5-6 years' + END as age, + CASE + WHEN age_months BETWEEN 0 AND 5 THEN 1 + WHEN age_months BETWEEN 6 AND 11 THEN 2 + WHEN age_months BETWEEN 12 AND 23 THEN 3 + WHEN age_months BETWEEN 24 AND 35 THEN 4 + WHEN age_months BETWEEN 36 AND 47 THEN 5 + WHEN age_months BETWEEN 48 AND 59 THEN 6 + ELSE 7 + END as sort_order + FROM ( + SELECT EXTRACT(YEAR FROM AGE(birth_date)) * 12 + EXTRACT(MONTH FROM AGE(birth_date)) as age_months + FROM children + WHERE birth_date IS NOT NULL AND deleted_at IS NULL + ) ages + ) + SELECT age, COUNT(*) as count + FROM age_groups + GROUP BY age, sort_order + ORDER BY sort_order`, ); return result.map((row: any) => ({ @@ -189,11 +192,11 @@ export class DashboardService { async getEngagementPattern(days: number = 7) { const result = await this.userRepository.query( `SELECT - EXTRACT(HOUR FROM created_at) as hour, - COUNT(DISTINCT user_id) as sessions + EXTRACT(HOUR FROM started_at) as hour, + COUNT(DISTINCT logged_by) as sessions FROM activities - WHERE created_at >= NOW() - INTERVAL '${days} days' - GROUP BY EXTRACT(HOUR FROM created_at) + WHERE started_at >= NOW() - INTERVAL '${days} days' + GROUP BY EXTRACT(HOUR FROM started_at) ORDER BY hour`, );