首页 > 解决方案 > 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','$a$') > 0, city , NULL)  as 'city'
     IF(LOCATE('country','$a$') > 0, country , NULL)  as 'country'
from tbl_employees
GROUP BY
     IF(LOCATE('department', '$a$') > 0, department, NULL)  as 'department',
     IF(LOCATE('city','$a$') > 0, city , NULL)  as 'city'
     IF(LOCATE('country','$a$') > 0, country , 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了分组列,那么我还会看到所有 NULL 值的departmentandcountry列。如何删除完全 NULL 列。这是实现这一目标的正确方法吗?以及如何删除完全具有 NULL 值的列。谢谢!

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

标签: mysqlsqldatabasegroup-bydynamicquery

解决方案


使用 Case 语句选择必填字段。然后使用对第一列的引用,分组中的 1

 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

推荐阅读