mysql - 如果记录不存在,如何在 group_concat 中添加空值?
问题描述
我有这个带有 substring_index 和 group_concat 的 SQL 查询,但我得到的结果没有给出值的正确位置,因为这些值不存在。
我需要添加一个空值或零值,以便在 sql 结果中具有正确的值位置。
桌子上有三个盖子(1、2、3)。盖子应该是 substring_index 的 P (P1, P2, P3) 的基础计数。
这是表格:
lid class_id class total
----- ------- ----- -----
1 73 Leader 10000
1 77 Consultant 8000
1 83 Coordinator 6000
2 73 Leader 20000
2 76 Staff 8000
2 77 Consultant 10000
3 73 Leader 30000
3 78 Team Leader 8000
这是我用于 group_concat 的 SQL 查询,用于汇总和 substring_index 以将分组值与其每一列(P1、P2、P3)分开
SELECT *, GROUP_CONCAT(lid) as lids, GROUP_CONCAT(pyear) as pyears,
COUNT(DISTINCT lib_id) AS total_count,
CASE WHEN COUNT(*)>=1 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(if(total is null,0,total) ORDER BY lid ASC SEPARATOR ' '),' ',1),' ',-1) END AS P1,
CASE WHEN COUNT(*)>=2 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(if(total is null,0,total) ORDER BY lid ASC SEPARATOR ' '),' ',2),' ',-1) END AS P2,
CASE WHEN COUNT(*)>=3 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(if(total is null,0,total) ORDER BY lid ASC SEPARATOR ' '),' ',3),' ',-1) END AS P3
FROM (
SELECT * FROM view_items WHERE lid='1'
UNION
SELECT * FROM view_items WHERE lid='2'
UNION
SELECT * FROM view_items WHERE lid='3'
) AS AZ GROUP BY class_id
这是上述查询的结果:
class id class lids P1 P2 P3
--------- ----- ----- ---- ---- ----
73 Leader 1,2,3 10000 20000 30000
76 Staff 2 8000
77 Consultant 1,2 8000 10000
78 Team Leader 3 8000
83 Coordinator 1 6000
即使记录不存在,盖子也应始终具有三个计数,应添加零或空值。如何添加空值?
这是我需要的预期结果。
class id class lids P1 P2 P3
--------- ----- ----- ---- ---- ----
73 Leader 1,2,3 10000 20000 30000
76 Staff 0,2,0 0 8000 0
77 Consultant 1,2,0 8000 10000 0
78 Team Leader 0,0,3 0 0 8000
83 Coordinator 1,0,0 6000 0 0
解决方案
用于else 0
_case expression
SELECT *, GROUP_CONCAT(lid) as lids, GROUP_CONCAT(pyear) as pyears,
COUNT(DISTINCT lib_id) AS total_count,
CASE WHEN COUNT(*)>=1 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(if(total is null,0,total) ORDER BY lid ASC SEPARATOR ' '),' ',1),' ',-1) else 0 END AS P1,
CASE WHEN COUNT(*)>=2 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(if(total is null,0,total) ORDER BY lid ASC SEPARATOR ' '),' ',2),' ',-1) else 0 END AS P2,
CASE WHEN COUNT(*)>=3 THEN SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(if(total is null,0,total) ORDER BY lid ASC SEPARATOR ' '),' ',3),' ',-1) else 0 END AS P3
FROM (
SELECT * FROM view_items WHERE lid='1'
UNION
SELECT * FROM view_items WHERE lid='2'
UNION
SELECT * FROM view_items WHERE lid='3'
) AS AZ GROUP BY class_id
推荐阅读
- c# - 将 EventHandler 与 Entity Framework 一起使用:在前一个异步操作完成之前在此上下文上启动了第二个操作
- python - 在python中从视频中提取所有帧的最快方法是什么?
- swift - 如何在 Xcode 控制台开发中修复“库未加载...原因:找不到图像”?
- java - 如何与受 TLS1.2 保护的 oracle 服务器建立连接?
- vuetify.js - Vuetify 数据表每页行数不起作用
- python - 使用非 BMP 字符引发错误会重新启动 shell
- wordpress - 如何防止 wordpress 中的 zxcvbn.min.js 加载?
- java - 按值分组地图
- sql - 需要开发两个表if和else之间的查询
- ios - 未收到 iOS 12 FCM 推送通知