[小ネタ][Looker]COUNT(*)とCOUNT(フィールド名)をLookerで実装してみる #looker

2021.08.23

さがらです。

小ネタ的な内容ですが、LookerでCOUNT(*)とCOUNT(フィールド名)をそれぞれ実装してみたので、検証した内容をまとめてみます。

COUNT(*)とCOUNT(フィールド名)の違い

突然ですが、SQLにおいてCOUNT(*)とCOUNT(フィールド名)の違いを知っていますか?

  • COUNT(*)
    • 対象のテーブル上のレコードを全てカウントする
  • COUNT(フィールド名)
    • 対象のフィールドにおいて、非NULL値を持つレコードをカウントする

ということで、COUNT(フィールド名)の場合にはNULL値はカウントされないのです。 (各DB・DWH製品によるかもしれませんが、少なくともBigQueryとPostgreSQLではこの仕様であることを確認しております。)

下図はBigQueryでの例です。

id列に1レコードだけNULLを設定して、COUNT(*)とCOUNT(id)の値を確認してみると、このように差が出てきます。

Lookerではどう実装するのか?

さて、ここで本題である「COUNT(*)とCOUNT(フィールド名)」をどう実装するのか、見ていきましょう。

結論から言うと、下記のように書けばOKです。

COUNT(*)は、typeパラメータをcountに指定するだけでOKです。

COUNT(フィールド名)は、filtersパラメータでNULL値を除外してカウントしたいフィールド名を記述し、フィルタ内容は-NULLでNULLを除外するように書けばOKです。

  ## COUNT(*)に該当
  measure: record_count {
    type: count
  }

  ## COUNT(フィールド名)に該当
  measure: record_count_without_null {
    type: count
    filters: [id: "-NULL"]
  }

このように記述すれば、Explore上でそれぞれのmeasureを選択すれば下図のような結果を得ることが出来ます。

最後に

「こんなの知ってるよ!」というネタかもしれませんが、この事象を知らないと値が合わないときドツボにハマりかねないので書いてみました。

頭の片隅に入れておくと、いざというときにスムーズに対応できると思います!