使用SQL中的参数进行分组
我试图根据预定义的参数下拉列表对报告进行分组。我想能够小计的总小时或总工资,我的报告基于部门或工作代码。我已经创建了参数,对此没有问题,我只是不确定是否可以使用这些参数来调用分组命令。下面是我想要的精神,但是GROUPBY子句即使没有参数也不适合我使用SQL中的参数进行分组,sql,parameters,group-by,subtotal,Sql,Parameters,Group By,Subtotal,我试图根据预定义的参数下拉列表对报告进行分组。我想能够小计的总小时或总工资,我的报告基于部门或工作代码。我已经创建了参数,对此没有问题,我只是不确定是否可以使用这些参数来调用分组命令。下面是我想要的精神,但是GROUPBY子句即使没有参数也不适合我 SELECT EmployeeID, LastName, FirstName, Department, JobCode, PayRate, SUM(Hours) as "Total Hours", SUM(Pay) as "Total Pay" FR
SELECT EmployeeID, LastName, FirstName, Department, JobCode, PayRate, SUM(Hours) as "Total Hours", SUM(Pay) as "Total Pay"
FROM Employees
GROUP BY @GroupBy
说到SQL,我真的是个新手,所以非常感谢您的帮助
谢谢。分组真的很简单
您必须按select语句中包含的且未提供给聚合函数的每个字段分组列出
这就是为什么在select中不能有固定列列表的变量group by。好吧,你可以在mysql中使用虚拟聚合,但它有效地将虚拟聚合应用于它们。我认为你根本误解了GroupBy的工作原理 分组是将多行聚合在一起的一种方法 如果返回任何不在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
可能有一种方法可以动态执行此操作,但这是一个非常糟糕的想法。您选择的任何未被聚合函数SUM、MIN等使用的列都需要在GROUP by子句中列出 比如说, SELECT EmployeeID, LastName, FirstName, SUM(Hours) as "Total Hours" FROM Employees GROUP BY EmployeeID, LastName, FirstName
这里有一些很好的例子:我对要求不是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'或任何其他值。如果要使用动态分组依据,则需要动态选择。如果您根据分组依据部门/作业代码发布了一个包含一些示例数据和两个预期结果的表,则会有所帮助