5

事前に定義されたパラメータのドロップダウン リストに基づいてレポートをグループ化しようとしています。部門または職務コードに基づいてレポートの合計時間または合計給与を小計できるようにしたいと考えています。パラメータを作成しましたが、問題はありません。これらのパラメータを使用してグループ化コマンドを呼び出すことができるかどうかはわかりません。以下は私が望んでいるものの精神ですが、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 に答える 4

8

要件は私には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'または他の値に設定する必要があります。

于 2012-01-13T21:20:43.960 に答える
4

仕組みを根本的に誤解していると思いますGROUP BY

GROUPINGは、多くの行をまとめて集計する方法です。

にないフィールドを返す場合GROUP BYは、それらをどうするかを決める必要があります。グループごとに複数の値を持つ可能性があるため、それらを使用して何もすることはできません。これらは、除外または集約する必要があります。

MAXそれらを集約するには、使用する関数 ( 、MINSUMAVGなど)を決定する必要があります。

従業員ごとに 1 行など、多くの行を表示したいが、その従業員の部門の合計に関する情報を含めたい場合は、サブクエリを使用する必要があります。

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

これを動的に行う方法があるかもしれませんが、それはかなりお粗末な考えです。

于 2012-01-13T21:01:00.490 に答える
2

Group by本当に簡単です。

group byselect ステートメントに含まれ、集計関数に渡されないすべてのフィールドにリストする必要があります。

group byこれが、列の固定リストを持つ変数を持つことができない理由ですselect。(まあ、mysql でできますが、仮想any()集計を効果的に適用します。)

于 2012-01-13T21:00:48.993 に答える
2

集計関数 (SUM、MIN など) のいずれにも使用されていない列を選択する場合は、GROUP BY句にリストする必要があります。

例えば、

EmployeeID、LastName、FirstName、SUM(Hours) を「合計時間」として選択します。
FROM社員
GROUP BY EmployeeID、LastName、FirstName

良い例: http://www.w3schools.com/sql/sql_groupby.asp

于 2012-01-13T21:05:11.487 に答える