首页 > 解决方案 > 如果记录不存在,如何在 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            

标签: mysqlsql

解决方案


用于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

推荐阅读