Jef*_*llo 4 sql parameters group-by subtotal
我试图以某种方式基于预定义的参数下拉列表对报告进行分组。我希望能够根据Department或JobCode汇总报告的总时数或总薪水。我已经创建了参数,并且没有问题,只是不确定是否可以使用这些参数来调用分组命令。以下是我想要的精神,但是即使没有参数,GROUP BY子句也对我不起作用。
SELECT EmployeeID, LastName, FirstName, Department, JobCode, PayRate, SUM(Hours) as "Total Hours", SUM(Pay) as "Total Pay"
FROM Employees
GROUP BY @GroupBy
Run Code Online (Sandbox Code Playgroud)
我真的是SQL的新手,因此非常感谢您的帮助。
谢谢。
我认为您从根本上误解了GROUP BY工作原理。
GROUPING是将许多行聚合在一起的一种方法。
如果您返回的任何字段不在 中GROUP BY,您需要决定如何处理它们。您不能对它们执行任何操作,因为每个组可能有多个值。它们必须被排除或聚合。
要聚合它们,您需要决定使用什么函数(MAX、MIN、SUM、AVG等)。
如果您想要显示多行,例如每个员工一行,但想要包含有关该员工所在部门总计的一些信息,则需要使用子查询:
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
Run Code Online (Sandbox Code Playgroud)
可能有一种方法可以动态地执行此操作,但这是一个非常糟糕的主意。
这项要求对我来说不是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;
Run Code Online (Sandbox Code Playgroud)
要尝试使用此设置:
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);
Run Code Online (Sandbox Code Playgroud)
显然,您想要设置@groupBy为一个'dept'或任何其他值。
Group by真的很简单。
您必须列出group byselect 语句中包含的每个字段,但不提供给聚合函数。
这就是为什么您不能group by在 中使用具有固定列列表的变量select。(嗯,你可以在 mysql 中,但它有效地将虚拟any()聚合应用于它们。)
| 归档时间: |
|
| 查看次数: |
20146 次 |
| 最近记录: |