0

次のような銀行スタッフ情報のテーブルがあります。

branchNumber    Position    firstName    lastName    staffNumber
------------    --------    ---------    --------    -----------
25              Manager     john         doe         11111
25              Secretary   robert       paulson     11112
25              Secretary   cindy        lu          11113
66              Manager     tim          timson      22223
66              Manager     jacob        jacobson    22224
66              Secretary   henry        henryson    22225
66              Supervisor  paul         paulerton   22226

実際にはこれで完了ですが、SQL共通テーブル式を使用して割り当てを完了しました。このプロジェクトでは使用できません。この形式で必要です。

branchNumber    numOfManagers    numOfSecretaries    numOfSupervisors    totalEmployees
------------    -------------    ----------------    ----------------    --------------
25                    1                 2                   0                   3
66                    2                 1                   1                   4

私の問題は、行からの情報を含む複数の列を取得することです。これまでのところ、

SELECT branchNumber, COUNT(*) AS numOfManagers
FROM Staff
WHERE position = 'Manager'
GROUP BY branchNumber, Position;

これにより、numOfManagers の正しい情報が出力されますが、CTE を使用しないと次の 3 つの列を作成できません。サブセレクトも試しましたが、うまくいきませんでした。誰にもアイデアはありますか?

4

1 に答える 1

6

次のようなものを使用できます。

select branchnumber,
  sum(case when Position ='Manager' then 1 else 0 end) numofManagers,
  sum(case when Position ='Secretary' then 1 else 0 end) numofSecretaries,
  sum(case when Position ='Supervisor' then 1 else 0 end) numofSupervisors,
  count(*) totalEmployees
from yourtable
group by branchnumber

デモで SQL Fiddle を参照してください

PIVOTまたは、次の関数を使用できます。

select branchnumber,
  'Manager', 'Secretary', 'Supervisor',
  TotalEmployees
from
(
  select t1.branchnumber,
    t1.position,
    t2.TotalEmployees
  from yourtable t1
  inner join
  (
    select branchnumber, count(*) TotalEmployees
    from yourtable
    group by branchnumber
  ) t2
    on t1.branchnumber = t2.branchnumber
) x
pivot
(
  count(position)
  for position in ('Manager', 'Secretary', 'Supervisor')
) p;

デモで SQL Fiddle を参照してください

于 2012-09-28T19:46:30.123 に答える