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