GROUP BY с использованием параметров в SQL - PullRequest
4 голосов
/ 14 января 2012

Я пытаюсь каким-то образом сгруппировать отчет на основе раскрывающегося списка параметров, который предварительно определен.Я хочу иметь возможность подытоживать общее количество часов или общую оплату моего отчета в зависимости от отдела или кода работы.Я создал параметры и у меня нет проблем с этим, я просто не уверен, возможно ли использовать эти параметры для вызова команды группировки.Ниже приведен дух того, что я хочу, но предложение GROUP BY не работает для меня даже без параметра.

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

Я действительно новичок, когда дело доходит до SQL, поэтому любая помощьочень ценится.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 14 января 2012

Требование не на 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', либо любое другое значение.

3 голосов
/ 14 января 2012

Я думаю, вы в корне не понимаете, как работает GROUP BY.

GROUPING - это способ агрегирования множества строк.

Если вы возвращаете поля, не входящие в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

Возможно, есть способделать это динамически, но это довольно плохая идея.

2 голосов
/ 14 января 2012

Любой выбранный вами столбец, который не используется ни одной из агрегатных функций (SUM, MIN и т. Д.), Должен быть указан в предложении GROUP BY.

Например,

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

Хорошие примеры здесь: http://www.w3schools.com/sql/sql_groupby.asp

2 голосов
/ 14 января 2012

Group by действительно просто.

Вы должны перечислить в group by каждое поле, которое включено в оператор выбора и не передано статистической функции.

Именно поэтому у вас не может быть переменной group by с фиксированным списком столбцов в select. (Ну, вы можете в mysql, но он эффективно применяет к ним виртуальные any() агрегаты.)

...