首页 > 解决方案 > 根据值返回唯一的不同值,按动态字段分组

问题描述

我有以下 SQL 查询:

SELECT DISTINCT
    username,
    (CASE WHEN role_id = 1 THEN SUM(user_roles.hours) ELSE NULL END) AS `Admin`,
    (CASE WHEN role_id = 2 THEN SUM(user_roles.hours) ELSE NULL END) AS `Subscriber`
FROM user_roles
LEFT JOIN users ON users.id = user_roles.user_id;

此查询的目的是在每一行上显示用户名,并为每个用户名显示管理员、订阅者等的小时数。

此查询产生以下结果:

username    Admin    Subscriber
abc         10       0
abc         0        5
def         0        7
def         4        0

每个用户名都应该有一个唯一的值,属于管理员或订阅者(任何用户都不能同时拥有)

我希望输出改为:

username    Admin    Subscriber
abc         10       5
def         4        7

没有显示零的列并且每个用户名只有一行结果。

我希望很清楚我要在这里完成什么。

谢谢你的帮助

标签: mysqlsql

解决方案


我认为您以相反的方式设置连接。
您应该对 to 进行左连接usersuser_roles使用条件聚合:

SELECT 
    u.username,
    SUM(CASE WHEN r.role_id = 1 THEN r.hours ELSE 0 END) AS `Admin`,
    SUM(CASE WHEN r.role_id = 2 THEN r.hours ELSE 0 END) AS `Subscriber`
FROM users u LEFT JOIN user_roles r 
ON u.id = r.user_id
GROUP BY u.username

推荐阅读