我试图以某种方式根据预定义的参数下拉列表对报告进行分组。我希望能够根据部门或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
对于SQL来说,我真的是一个新手,所以非常感谢任何帮助。
谢谢。
答案 0 :(得分:4)
这个要求对我来说不是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'
或任何其他值。
答案 1 :(得分:3)
我认为你从根本上误解了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
可能有一种方法可以动态地执行此操作,但这是一个非常糟糕的主意。
答案 2 :(得分:2)
Group by
真的很简单。
您必须在group by
列出select语句中包含的每个字段,而不是输入到聚合函数。
这就是为什么你不能在group by
中使用固定列表列表的变量select
。 (好吧,你可以在mysql中,但它有效地将虚拟any()
聚合应用于它们。)
答案 3 :(得分:2)
您选择的任何未被其中一个聚合函数(SUM,MIN等)使用的列都需要在GROUP BY
子句中列出。
例如,
SELECT EmployeeID, LastName, FirstName, SUM(Hours) as "Total Hours" FROM Employees GROUP BY EmployeeID, LastName, FirstName