mysql - 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 值的department
andcountry
列。如何删除完全 NULL 列。这是实现这一目标的正确方法吗?以及如何删除完全具有 NULL 值的列。谢谢!
JS 小提琴 - https://www.db-fiddle.com/f/cy7swwpphFSNssHPpZgKtH/1
解决方案
使用 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
推荐阅读
- postgresql - 将数据从 postgres 导入到 cytoscape
- c# - 使用反射从 Class 属性中获取 DisplayNames 列表
- html - 在编辑输入之前,Angular 所需的验证不会让表单有效
- java - 如何在 Eclipse RCP 3 中使用 dnd 打开一个新的编辑器
- solidity - 试图在solidity中创建一个可变大小的数组
- dart - 用异步变量初始化类
- c# - 我需要在任何事件处理程序之外执行一些代码。在 C# Windows 窗体中可以做到这一点吗?
- android - Android Studio 在生成签名 Apk 时冻结
- sql-server - 使用 Excel vba 从 SQL Server 获取数据并修改其中一些,然后更新表
- bash - 从 Bitbucket 获取拉取请求 ID,并传递给 Teamcity 中的 bash 脚本