MySql 查询中的动态分组依据

问题描述

我有一个 employees 表,其中包含 Name,Salary,City,Country,Department 之类的字段。我还有一个用户输入,用户可以在其中选择多个列标题,例如我的员工表中的城市、国家等。我需要进行一个动态查询,按用户选择的所有字段进行分组,并返回结果。例如。各城市工资总额、国家工资总额、国家工资总额等

这是我在做什么 - ('$a' 是我从下拉菜单中得到的变量)。

SELECT
     sum(salary) as sum_salary,IF(LOCATE('department','$a$') > 0,department,NULL)  as 'department',IF(LOCATE('city',city,NULL)  as 'city'
     IF(LOCATE('country',country,NULL)  as 'country'
from tbl_employees
GROUP BY
     IF(LOCATE('department',NULL)  as 'country'
LIMIT 10000

样本数据

NAME | SALARY | CITY | COUNTRY| DEPARTMENT
n1     50       Chi    US       Design
n2     100      Chi    US       Product
n3     500      SF     US       Engg
n5     20       SF     US       Engg
n1     200      SF     US       Product

如果'$a' = 'city',这就是我想要的

   SUM(SALARY) |   CITY
   150             Chi
   720              SF

这是我得到的

   SUM(SALARY) |   CITY  | COUNTRY  | DEPARTMENT
   150             Chi     NULL       NULL
   720              SF     NULL       NULL

问题在于,如果用户只选择了 city 作为分组依据列,那么我还会看到 departmentcountry 列的值都是 NULL。如何删除完全 NULL 列。这是实现这一目标的正确方法吗?以及如何删除完全具有 NULL 值的列。谢谢!

JS 小提琴 - https://www.db-fiddle.com/f/cy7swwpphFSNssHPpZgKtH/1

解决方法

使用 Case 语句选择所需字段。然后使用对第一列的引用,1 in group by

 SELECT
         case when LOCATE('department','$a$') > 0 then department
              when LOCATE('city','$a$') > 0 then city
              when LOCATE('country','$a$') > 0 then country
         else Null
         end as field,sum(salary) as sum_salary,from tbl_employees
    GROUP BY 1    
    LIMIT 10000