I am trying to somehow group a report based on a drop-down list of parameters that is pre-defined. I want to be able to subtotal the Total Hours or Total Pay of my report based on Department or JobCode. I have created the parameters and have no problem with that, I just am not sure if it's possible to use those parameters to call out a grouping command. Below is the spirit of what I am wanting, but the GROUP BY clause doesn't work for me even without a parameter.
SELECT EmployeeID, LastName, FirstName, Department, JobCode, PayRate, SUM(Hours) as "Total Hours", SUM(Pay) as "Total Pay"
FROM Employees
GROUP BY @GroupBy
I am truly a novice when it comes to SQL, so any help is very much appreciated.
Thank You.
Any column you are selecting that are not used by one of the aggregate function (SUM, MIN, etc) needs to be listed in the
GROUP BY
clause.For example,
Good examples here: http://www.w3schools.com/sql/sql_groupby.asp
Group by
is simple really.You have to list in
group by
every field that is included in the select statement and not fed to an aggregate function.Which is why you can't have a variable
group by
with a fixed list of columns inselect
. (Well, you can in mysql, but it effectively applies virtualany()
aggregate to them.)I think you are fundamentally misunderstanding how
GROUP BY
works.GROUPING is a way to aggregate many rows together.
If you return any fields not in the
GROUP BY
, you need to decide what to do with them. You can't NOT do anything with them because you could have multiple values per group. They must be either excluded or aggregated.To aggregate them, you need to decide what function to use (
MAX
,MIN
,SUM
,AVG
, etc).If you want to show many rows, say one per employee, but want to include some information about totals for that employee's department, you need to use a subquery:
There may be a way to do this dynamically but that is a pretty poor idea.
The requirement is not 100% clear to me, but I imagine your after something like this:
To be tried with this setup:
Obviously, you want to set
@groupBy
to either'dept'
or any other value.