package main import ( "bindbox-game/configs" "bindbox-game/internal/repository/mysql" "bindbox-game/internal/repository/mysql/model" "flag" "fmt" ) type RevenueStat struct { ActivityID int64 TotalRevenue int64 TotalDiscount int64 } type DrawStat struct { ActivityID int64 TotalCount int64 GamePassCount int64 PaymentCount int64 RefundCount int64 PlayerCount int64 } func main() { flag.Parse() configs.Init() dbRepo, err := mysql.New() if err != nil { panic(err) } db := dbRepo.GetDbR() activityIDs := []int64{89} // 1. Debug Step 2: Draw Stats var drawStats []DrawStat err = db.Table(model.TableNameActivityDrawLogs). Select(` activity_issues.activity_id, COUNT(activity_draw_logs.id) as total_count, SUM(CASE WHEN orders.status = 2 AND orders.actual_amount = 0 THEN 1 ELSE 0 END) as game_pass_count, SUM(CASE WHEN orders.status = 2 AND orders.actual_amount > 0 THEN 1 ELSE 0 END) as payment_count, SUM(CASE WHEN orders.status IN (3, 4) THEN 1 ELSE 0 END) as refund_count, COUNT(DISTINCT CASE WHEN orders.status = 2 THEN activity_draw_logs.user_id END) as player_count `). Joins("JOIN activity_issues ON activity_issues.id = activity_draw_logs.issue_id"). Joins("LEFT JOIN orders ON orders.id = activity_draw_logs.order_id"). Where("activity_issues.activity_id IN ?", activityIDs). Group("activity_issues.activity_id"). Scan(&drawStats).Error if err != nil { fmt.Printf("DrawStats Error: %v\n", err) } else { fmt.Printf("DrawStats: %+v\n", drawStats) } // 2. Debug Step 3: Revenue Stats (With WHERE filter) var revenueStats []RevenueStat err = db.Table(model.TableNameOrders). Select(` activity_issues.activity_id, SUM(orders.actual_amount * order_activity_draws.draw_count / order_total_draws.total_count) as total_revenue, SUM(orders.discount_amount * order_activity_draws.draw_count / order_total_draws.total_count) as total_discount `). Joins(`JOIN ( SELECT activity_draw_logs.order_id, activity_issues.activity_id, COUNT(*) as draw_count FROM activity_draw_logs JOIN activity_issues ON activity_issues.id = activity_draw_logs.issue_id GROUP BY activity_draw_logs.order_id, activity_issues.activity_id ) as order_activity_draws ON order_activity_draws.order_id = orders.id`). Joins(`JOIN ( SELECT order_id, COUNT(*) as total_count FROM activity_draw_logs GROUP BY order_id ) as order_total_draws ON order_total_draws.order_id = orders.id`). Joins("JOIN activity_issues ON activity_issues.activity_id = order_activity_draws.activity_id"). Where("orders.status = ? AND orders.status != ?", 2, 4). Where("orders.actual_amount > ?", 0). // <--- The problematic filter? Where("activity_issues.activity_id IN ?", activityIDs). Group("activity_issues.activity_id"). Scan(&revenueStats).Error if err != nil { fmt.Printf("RevenueStats (With Filter) Error: %v\n", err) } else { fmt.Printf("RevenueStats (With Filter): %+v\n", revenueStats) } // 3. Debug Step 3: Revenue Stats (Without WHERE filter, using CASE in Select) var revenueStats2 []RevenueStat err = db.Table(model.TableNameOrders). Select(` activity_issues.activity_id, SUM(orders.actual_amount * order_activity_draws.draw_count / order_total_draws.total_count) as total_revenue, SUM(CASE WHEN orders.actual_amount > 0 THEN orders.discount_amount * order_activity_draws.draw_count / order_total_draws.total_count ELSE 0 END) as total_discount `). Joins(`JOIN ( SELECT activity_draw_logs.order_id, activity_issues.activity_id, COUNT(*) as draw_count FROM activity_draw_logs JOIN activity_issues ON activity_issues.id = activity_draw_logs.issue_id GROUP BY activity_draw_logs.order_id, activity_issues.activity_id ) as order_activity_draws ON order_activity_draws.order_id = orders.id`). Joins(`JOIN ( SELECT order_id, COUNT(*) as total_count FROM activity_draw_logs GROUP BY order_id ) as order_total_draws ON order_total_draws.order_id = orders.id`). Joins("JOIN activity_issues ON activity_issues.activity_id = order_activity_draws.activity_id"). Where("orders.status = ? AND orders.status != ?", 2, 4). // Where("orders.actual_amount > ?", 0). // Removed Where("activity_issues.activity_id IN ?", activityIDs). Group("activity_issues.activity_id"). Scan(&revenueStats2).Error if err != nil { fmt.Printf("RevenueStats (With CASE) Error: %v\n", err) } else { fmt.Printf("RevenueStats (With CASE): %+v\n", revenueStats2) } }