问题描述
我有一个 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
作为分组依据列,那么我还会看到 department
和 country
列的值都是 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