Home > 未分類 > Unionを使わない複数集計

Unionを使わない複数集計

トラックバックURL:

shimazakiです。

今日はSQLの話です。

SQLってプログラムと違い、上から順に処理されるわけではなく、まとめて処理されるのでなかなか理解できません。

SQLってこんなことも出来たのか!と感動した時の話をしたいと思います。

例えばこんなテーブルがあったとして(試験の結果テーブルだと思っていただければ)

  • sampleTbl
  • ID point
    A 100
    B 90
    C 88
    D 70
    E 95
    F 80
  • 100点の人数と、90〜99点の人数と、80〜89点の人数と70〜79点一覧を抽出したい場合
  • select ‘p100′ as pnt,count(*) as cntpoint from sampleTbl where point = 100

    union

    select ‘p90′ as pnt,count(*) as cntpoint from sampleTbl where point between 90 and 99

    union

    select ‘p80′ as pnt,count(*) as cntpoint from sampleTbl where point between 80 and 89

    union

    select ‘p70′ as pnt,count(*) as cntpoint from sampleTbl where point between 70 and 79;

    pnt cntpoint
    p100 1
    p90 3
    p80 1
    p70 1

    というSQLを、

    select

    sum( if( point=100, 1,0)) as p100,

    sum( if( point between 90 and 99 , 1,0 ) ) as p90,

    sum( if( point between 80 and 89 , 1,0 ) ) as p80,

    sum( if( point between 70 and 79 , 1,0 ) ) as p70

    from sampleTbl;

    p100 p90 p80 p70
    1 3 1 0

    と言うSQLに変更します。

    条件に一致する行を1とし、その個数をカウントすることで、結果を一行で取得することができます。

    これが、単一の試験結果であればそれほど利点はないのですが、例えば、今回のテスト結果と前回のテスト結果を表示する画面、というものがあった場合、先述のunion方式では結果データの構成が複雑になってしまいますが、後述の方法であれば、今回の結果行と前回の結果行という取得が可能なので、結果データの構成が分かりやすくなります。

    SQLの理解がまだまだ足りないと思う今日この頃でした。

この記事へのコメント: 0件

コメントをどうぞ
上記情報を記憶する(次回から入力の手間が省けます)

トラックバック+ピンバック: 0件

Home > 未分類 > Unionを使わない複数集計

ページ
メタ情報

Page Top