逆から考える
まずは,
- 1:プロジェクトリーダー
- 2:サブリーダー
- 0:メンバー
図2 集計用のキーがないテーブル
ProjectEmps
project_ | emp_ | leader_ |
---|---|---|
AA00 | 0001 | 1 |
AA00 | 0002 | 2 |
AA00 | 0003 | 2 |
AA00 | 0004 | 0 |
AA00 | 0005 | 0 |
BB99 | 0001 | 1 |
BB99 | 0005 | 0 |
KG33 | 0010 | 1 |
KG33 | 0011 | 2 |
KG33 | 0007 | 0 |
XB49 | 0006 | 1 |
XB49 | 0001 | 0 |
XB49 | 0007 | 0 |
XB49 | 0022 | 0 |
ここで,
さて,
リスト1 プロジェクトごとの参加人数を抽出するクエリ
SELECT project_id,
COUNT(*) AS all_cnt,
SUM(CASE WHEN leader_flg = '2' THEN 1 ELSE 0 END) AS sub_leader_cnt,
SUM(CASE WHEN leader_flg = '0' THEN 1 ELSE 0 END) AS member_cnt
FROM ProjectEmps
GROUP BY project_id;
図3 プロジェクトの参加人数が抽出されたテーブル
プロジェクトの参加人数
project_ | all_ | sub_ | member_ |
---|---|---|---|
AA00 | 5 | 2 | 2 |
BB99 | 2 | 0 | 1 |
KG33 | 3 | 1 | 1 |
XB49 | 4 | 0 | 3 |
このSQLに難しいところは特にありません。SUM関数の中でCASE式を使ってクロス表を作るテクニックも,
ではちょっと角度を変えて,
図4 求めたい結果
リーダーの配下人数
leader | all_ | sub_ | member_ |
---|---|---|---|
0001 | 5 | 2 | 3 |
0006 | 3 | 0 | 3 |
0010 | 2 | 1 | 1 |
これもまた,
いま,
こういう場合,
図5 ミッシングリンクを探せ
ProjectEmps
project_ | emp_ | leader_ |
---|---|---|
AA00 | 0001 | 1 |
AA00 | 0002 | 2 |
AA00 | 0003 | 2 |
AA00 | 0004 | 0 |
AA00 | 0005 | 0 |
BB99 | 0001 | 1 |
BB99 | 0005 | 0 |
KG33 | 0010 | 1 |
KG33 | 0011 | 2 |
KG33 | 0007 | 0 |
XB49 | 0006 | 1 |
XB49 | 0001 | 0 |
XB49 | 0007 | 0 |
XB49 | 0022 | 0 |
リーダーの配下人数
leader | all_ | sub_ | member_ |
---|---|---|---|
0001 | 5 | 2 | 3 |
0006 | 3 | 0 | 3 |
0010 | 2 | 1 | 1 |
- 注2)
- この
「答えから考える」 という方法は, 数学の手法として古くから知られていますが, アルゴリズムのように 「使えば機械的に答えが出る」 という厳密なものではありません。こういう 「必ずうまくいくわけではないが, 役に立つこともある」 という程度の補助的な方法を, ヒューリスティクス (heuristic) とか発見的解法と呼びます。あくまで補助なので, 公式のように覚え込んで固執すると逆にマイナスになります。使うときは 「大人の裁量」 でお願いします。