SQLでselectする件数をカウントする。
条件にあったデータが何件かを取得するには、
count」を使います。

グループ化して
社員ごとの売上件数とか
店舗ごとの在庫点数とか
いう具合に使います。

新入社員くんに教えたので書いておきます。
慣れてない人からするとこういう概念覚えるの難しいみたいですね。

一番簡単なcountの例です。

select
  count(*) as cnt
from
stock;

stockテーブル(全社の在庫データが入っている)の件数を取得しています。
日本語に直すと、全社の在庫数を取得しています。

こんな使い方をするのは稀で、
基本条件にあった件数を取得することになります。

select
  count(*) as cnt
from
  stock
where
  item_cd = ‘10000’;

item_cdが10000の商品の件数を取得しています。
日本語に直すと、全社の商品コードが10000の商品の個数を取得しています。

ここまではすごくシンプルですね♪

でも、業務上こんなデータを頼まれることはそれほど多くないです。
基本的に「さっきのデータやけど、○○ごとの在庫数を教えて!」って言われてしまいます。

○○ごとに?
これを実現するために、○○を基準にグループ化します。

select
  shop, count(*) as cnt
from
  stock
where
  item_cd = ‘10000’
group by
    shop;

これで、item_cdが10000の在庫をshop(店)ごとに集計します。
group by の後に付けた項目を元にグループ化されます。
複数の項目でグループ化する際は「,」で区切って項目を記入します。

上記例で、select されるデータにグループ化する項目を付けなくてもそれぞれの件数をcntとして取得できますが、
グループ化する項目をつけていないとその数値がどの店舗のものかわからないのでグループ化した項目は付けるようにしましょう。

ここで、更に注文を付けられることがあります。
「そのデータの中で件数が10件以上のものだけちょうだい」
件数が10件以上。。。

こういう時は、havingを使います。
使い方はこんな感じです。

select
  shop, count(*) as cnt
from
  stock
where
  item_cd = ‘10000’
group by
  shop
having
    count(*) > 10;

これで10個以上在庫がある店舗のデータだけ抽出することができます。

グループ化するときの処理の順番は、下記のようになります。

  1. whereの条件でグループ化する前にデータを絞り込む
  2. gourp byで指定した項目ごとにデータを集計する
  3. havingの条件でグループ化した内容を更に絞り込む

whereはグループ化する前に絞り込むときに使用し、
havingはグループ化後に絞り込む時に使用します(集計関数が使えます)。
処理の順番を意識して、絞込条件を指定しましょう!

以上で、グループ化による件数取得の説明終了!!
これと同じ原理で、合計や平均値を求めることができます。

それはまた、別のお話