SUM case returns 不带 GROUP BY 的值
SUM case returns value without GROUP BY
当我在案例 select 周围添加 SUM 时,它 returns 没有 GROUP BY 的总和值。
我正在使用的不带 SUM 的查询如下
SELECT CASE WHEN subscription_types.type = 'Succes lidmaatschap' THEN 7 ELSE 8 END FROM subscription_used
INNER JOIN training_sessions ON training_sessions.id = subscription_used.training_session_id
INNER JOIN training_series AS tserie ON tserie.id = training_sessions.training_serie_id
INNER JOIN user_training_session ON user_training_session.training_session_id = training_sessions.id
INNER JOIN subscriptions ON subscriptions.id = subscription_used.subscription_id
INNER JOIN subscription_types ON subscription_types.id = subscriptions.subscription_type_id
WHERE subscription_used.training_session_id = (SELECT training_sessions.id FROM training_sessions WHERE DATE(event_start_date) = @week_2_ago_date AND training_serie_id = 17) AND present=1
GROUP BY subscriptions.id
此查询 returns 值:8,7。但是,当我在案例中加上 SUM 时,它会给出数字 75。75 是在没有 GROUP BY 的情况下返回的值的 SUM。
关于如何解决此问题以便查询为我提供正确值(8+7 = 15、1 行)的任何想法?提前致谢
Group by 暗示基于 subscription.id 的不同值,所以如果您按组分组,您可能会得到类似 8,8,8,8,8,7,7,7,7 的值, 7 由于联接等原因。
对于 group by 你只能得到不同的值 8 和 7。当你对 group 求和时,它会计算所有这些值,但不是 2 个不同的值。
最简单的修复会给你 15:
SELECT SUM(SUBSCRIPTION_USED) FROM (
SELECT CASE WHEN subscription_types.type = 'Succes lidmaatschap' THEN 7 ELSE 8 END FROM subscription_used
INNER JOIN training_sessions ON training_sessions.id = subscription_used.training_session_id
INNER JOIN training_series AS tserie ON tserie.id = training_sessions.training_serie_id
INNER JOIN user_training_session ON user_training_session.training_session_id = training_sessions.id
INNER JOIN subscriptions ON subscriptions.id = subscription_used.subscription_id
INNER JOIN subscription_types ON subscription_types.id = subscriptions.subscription_type_id
WHERE subscription_used.training_session_id = (SELECT training_sessions.id FROM training_sessions WHERE DATE(event_start_date) = @week_2_ago_date AND training_serie_id = 17) AND present=1
GROUP BY subscriptions.id);
不过,这可能是一种更好的写法。
编辑:如果您只想对不同的值求和,也可以执行 SUM(DISTINCT CASE ......)。
当我在案例 select 周围添加 SUM 时,它 returns 没有 GROUP BY 的总和值。
我正在使用的不带 SUM 的查询如下
SELECT CASE WHEN subscription_types.type = 'Succes lidmaatschap' THEN 7 ELSE 8 END FROM subscription_used
INNER JOIN training_sessions ON training_sessions.id = subscription_used.training_session_id
INNER JOIN training_series AS tserie ON tserie.id = training_sessions.training_serie_id
INNER JOIN user_training_session ON user_training_session.training_session_id = training_sessions.id
INNER JOIN subscriptions ON subscriptions.id = subscription_used.subscription_id
INNER JOIN subscription_types ON subscription_types.id = subscriptions.subscription_type_id
WHERE subscription_used.training_session_id = (SELECT training_sessions.id FROM training_sessions WHERE DATE(event_start_date) = @week_2_ago_date AND training_serie_id = 17) AND present=1
GROUP BY subscriptions.id
此查询 returns 值:8,7。但是,当我在案例中加上 SUM 时,它会给出数字 75。75 是在没有 GROUP BY 的情况下返回的值的 SUM。
关于如何解决此问题以便查询为我提供正确值(8+7 = 15、1 行)的任何想法?提前致谢
Group by 暗示基于 subscription.id 的不同值,所以如果您按组分组,您可能会得到类似 8,8,8,8,8,7,7,7,7 的值, 7 由于联接等原因。
对于 group by 你只能得到不同的值 8 和 7。当你对 group 求和时,它会计算所有这些值,但不是 2 个不同的值。
最简单的修复会给你 15:
SELECT SUM(SUBSCRIPTION_USED) FROM (
SELECT CASE WHEN subscription_types.type = 'Succes lidmaatschap' THEN 7 ELSE 8 END FROM subscription_used
INNER JOIN training_sessions ON training_sessions.id = subscription_used.training_session_id
INNER JOIN training_series AS tserie ON tserie.id = training_sessions.training_serie_id
INNER JOIN user_training_session ON user_training_session.training_session_id = training_sessions.id
INNER JOIN subscriptions ON subscriptions.id = subscription_used.subscription_id
INNER JOIN subscription_types ON subscription_types.id = subscriptions.subscription_type_id
WHERE subscription_used.training_session_id = (SELECT training_sessions.id FROM training_sessions WHERE DATE(event_start_date) = @week_2_ago_date AND training_serie_id = 17) AND present=1
GROUP BY subscriptions.id);
不过,这可能是一种更好的写法。
编辑:如果您只想对不同的值求和,也可以执行 SUM(DISTINCT CASE ......)。