2012-01-13 91 views
4

我想以某种方式基于预定义参数的下拉列表对报表进行分组。我希望能够根据Department或JobCode小计我的报告的总时数或总薪酬。我已经创建了参数并且没有任何问题,我只是不确定是否可以使用这些参数来调出分组命令。下面是我想要的精神,但即使没有参数,GROUP BY子句也不适用于我。GROUP BY使用SQL中的参数

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

当谈到SQL时,我确实是一个新手,因此非常感谢所有帮助。

谢谢。

+0

如果您打算使用动态GROUP BY,则需要动态SELECT。 – UnhandledExcepSean 2012-01-13 20:59:12

+0

如果您根据“按部门分组”/“jobCode” – 2012-01-13 21:14:43

回答

2

Group by真的很简单。

您必须在group by中列出select语句中包含的所有字段,而不是输入到聚合函数。

这就是为什么你不能有一个变量group byselect固定列列表。 (嗯,你可以在MySQL,但它有效地应用于虚拟any()总给他们。)

3

我想你是误会根本如何GROUP BY作品。

GROUPING是聚集许多行在一起的方式。

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

要合计它们,您需要决定使用哪个函数(MAX,MIN,SUM,等)。

如果你想显示多行,说每名员工之一,但希望包括大约总计为员工所在部门的一些信息,你需要使用一个子查询:

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 

可能有办法动态地做到这一点,但这是一个非常糟糕的主意。

+0

谢谢您发布了包含一些示例数据和两个预期结果的表格,这将有所帮助。我不确定这是否会起作用。 – 2012-01-16 13:43:11

2

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

例如,

 
SELECT EmployeeID, LastName, FirstName, SUM(Hours) as "Total Hours" 
FROM Employees 
GROUP BY EmployeeID, LastName, FirstName 

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

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