Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL中的参数进行分组_Sql_Parameters_Group By_Subtotal - Fatal编程技术网

使用SQL中的参数进行分组

使用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

我试图根据预定义的参数下拉列表对报告进行分组。我想能够小计的总小时或总工资,我的报告基于部门或工作代码。我已经创建了参数,对此没有问题,我只是不确定是否可以使用这些参数来调用分组命令。下面是我想要的精神,但是GROUPBY子句即使没有参数也不适合我

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'或任何其他值。

如果要使用动态分组依据,则需要动态选择。如果您根据分组依据部门/作业代码发布了一个包含一些示例数据和两个预期结果的表,则会有所帮助