【问题标题】:CASE statement not working as it should in SQLCASE 语句在 SQL 中不能正常工作
【发布时间】:2016-08-04 19:53:12
【问题描述】:
SELECT  userid,                                                                                         
  (SELECT CASE WHEN (COUNT(CASE WHEN casinowagers != 0
          THEN 1
            ELSE null
          END)
                + COUNT(CASE WHEN depositmade_amt != 0
                        THEN 1
                            ELSE null
                        END)) >= 3  
        AND (Round(sum(totalhold - playercomps - freemoney - (depositmade_amt*.1)),2)) >= 10
                THEN "VIP"
                    ELSE "NON-VIP"
                END as VIPcheck 
    FROM player_activity        
    WHERE YEAR(txndate) = YEAR(CURRENT_DATE - INTERVAL 3 MONTH)
        AND MONTH(txndate) = MONTH(CURRENT_DATE - INTERVAL 3 MONTH)         
    ) as vipMonthStatus,            
    (COUNT(CASE WHEN casinowagers != 0
            THEN 1
            ELSE null
            END) 
                + COUNT(CASE WHEN depositmade_amt != 0
                        THEN 1
                            ELSE null
                        END)) as activityCount, 
    (Round(sum(totalhold - playercomps - freemoney - (depositmade_amt*.1)),2)) as Value,                        
FROM player_activity
WHERE userid = 2023410 
GROUP BY year(txndate),month(txndate)  
LIMIT 1000

所以基本上 vipMonth 状态总是返回为“VIP”。但是,对于 5 月份(由于下面的“where”声明),它应该是“non-vip”,因为只进行了 1 次存款和 1 次投注。

什么给了?

( WHERE YEAR(txndate) = YEAR(CURRENT_DATE - INTERVAL 3 MONTH)
        AND MONTH(txndate) = MONTH(CURRENT_DATE - INTERVAL 3 MONTH) )

【问题讨论】:

  • 我猜您在该子查询中还需要WHERE userid = 2023410(或将其与等效的 WHERE 相关联)。

标签: mysql sql count case


【解决方案1】:

您需要将 vipMonthStatus 子查询中的 player_activity 表绑定到主查询中的 player_activity 表。

首先为“内部”player_activity 和“外部”player_activity 表取别名,以便您可以区分它们。像 in_player_activity 和 out_player_activity 这样的东西。

然后需要在 vipMonthStatus 子查询中添加一条额外的 WHERE 语句,以根据 userid 将内表中的记录限制为外表中的关联记录。它最终会是这样的:

FROM player_activity in_player_activity     
WHERE YEAR(in_player_activity.txndate) = YEAR(CURRENT_DATE - INTERVAL 3 MONTH)
    AND MONTH(in_player_activity.txndate) = MONTH(CURRENT_DATE - INTERVAL 3 MONTH)  
    AND in_player_activity.userid = out_player_activity.userid 

请记住,既然您已经引入了表别名,您需要将别名前缀添加到所有其他列名。就我个人而言,我会使用更简洁的东西,比如 opa 和 ipa。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2011-03-14
    • 2017-10-07
    • 2014-11-13
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多