mysql - 根据值返回唯一的不同值,按动态字段分组
问题描述
我有以下 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
没有显示零的列并且每个用户名只有一行结果。
我希望很清楚我要在这里完成什么。
谢谢你的帮助
解决方案
我认为您以相反的方式设置连接。
您应该对 to 进行左连接users
并user_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
推荐阅读
- amazon-redshift - RedShift:从所有表中插入一些不同的列
- angular - 如何配置 ESLint 以遵循 Angular 最佳实践?
- python - Keras - AttributeError:Layer module_wrapper_18 没有入站节点
- spring-boot - 将基本身份验证标头添加到 Spring Boot 中的所有请求
- java - 春季批处理:AsyncItemProcessor 不会终止
- datetime - 如何通过 UTC 偏移量确定时区并将 UTC 时间戳转换为 Java8 中的任何其他时区?
- python - 打开通过 python 编写的 .xlsx 文件时。弹出错误:- 文件格式或文件扩展名无效,验证文件未损坏
- google-cloud-platform - 带有 Istio Ingress-Gateway 后端的 Google GCE 外部 HTTPS 入口
- powershell - 尝试获取 UserPrincipal.Current 时出现 InvalidCastException
- r - 在特定时间点计算每组唯一 ID 的数量