GROUP BY 在 SQL 中使用参数

Posted

技术标签:

【中文标题】GROUP BY 在 SQL 中使用参数【英文标题】:GROUP BY using parameters in SQL 【发布时间】:2012-01-13 20:53:52 【问题描述】:

我正在尝试根据预定义的参数下拉列表对报告进行分组。我希望能够根据部门或职位代码对我的报告的总小时数或总工资进行小计。我已经创建了参数并且对此没有任何问题,我只是不确定是否可以使用这些参数来调用分组命令。以下是我想要的精神,但 GROUP BY 子句即使没有参数也对我不起作用。

SELECT EmployeeID, LastName, FirstName, Department, JobCode, PayRate, SUM(Hours) as "Total Hours", SUM(Pay) as "Total Pay"
FROM Employees
GROUP BY @GroupBy

我是一个真正的 SQL 新手,因此非常感谢任何帮助。

谢谢。

【问题讨论】:

如果您要使用动态 GROUP BY,则需要动态 SELECT。 如果您根据“按部门分组”/“jobCode”发布一个包含一些示例数据和两个预期结果的表格会有所帮助 【参考方案1】:

这个要求对我来说不是 100% 清楚,但我想你会这样:

select
  case when @groupBy = 'dept' then
       department else
       jobCode    end  dept_jobCode,
  sum(hours)
from employees
group by 
  case when @groupBy = 'dept' then
       department else
       jobCode    end;

尝试使用此设置:

create table employees (
  lastName   varchar(20),
  department varchar(20),
  jobCode    varchar(20),
  hours      number
);

insert into employees values ('Miller', 'Dept 1', 'A', 10);
insert into employees values ('Doe'   , 'Dept 1', 'A',  7);
insert into employees values ('Baker' , 'Dept 1', 'B',  4);

insert into employees values ('Sand'  , 'Dept 2', 'B',  6);
insert into employees values ('Stark' , 'Dept 2', 'B',  9);
insert into employees values ('Gild'  , 'Dept 2', 'A',  9);

显然,您希望将 @groupBy 设置为 'dept' 或任何其他值。

【讨论】:

【参考方案2】:

我认为您从根本上误解了 GROUP BY 的工作原理。

GROUPING 是一种将许多行聚合在一起的方法。

如果您返回任何不在GROUP BY 中的字段,您需要决定如何处理它们。您不能对它们做任何事情,因为每个组可能有多个值。它们必须被排除或汇总。

要聚合它们,您需要决定使用什么函数(MAXMINSUMAVG 等)。

如果您想显示多行,例如每个员工一行,但又想包含有关该员工部门总计的一些信息,则需要使用子查询:

SELECT employeeid, <other unaggregated fields>
FROM MyTable t
INNER JOIN (SELECT DepartmentID, SUM(Totalhours) as TotHours...etc
            FROM SomeOtherTable
            GROUP BY DepartmentID) as Sub
  ON Sub.DepartmentID = t.departmentID

可能有一种方法可以动态执行此操作,但这是一个非常糟糕的主意。

【讨论】:

【参考方案3】:

Group by 真的很简单。

您必须在 group by 中列出 select 语句中包含且未馈送到聚合函数的每个字段。

这就是为什么你不能在select 中有一个带有固定列列表的变量group by。 (嗯,你可以在 mysql 中,但它有效地将虚拟 any() 聚合应用于它们。)

【讨论】:

【参考方案4】:

您选择的任何未由聚合函数(SUM、MIN 等)之一使用的列都需要在 GROUP BY 子句中列出。

例如,

SELECT EmployeeID, LastName, FirstName, SUM(Hours) as "Total Hours" 来自员工 GROUP BY EmployeeID、姓氏、名字

这里有很好的例子:http://www.w3schools.com/sql/sql_groupby.asp

【讨论】:

以上是关于GROUP BY 在 SQL 中使用参数的主要内容,如果未能解决你的问题,请参考以下文章

group by 优化大法

MySQL使用group by 报this is incompatible with sql_mod

如何确定通用 PL/SQL 过程的参数(执行 group by 子句)?

SQL - 在 Group By 中使用别名

使用 Group By 选择无法正常工作

sql中group by和order by的区别