見出し画像

Tableau 8つのハードルを越える⑪「集計と非集計 その3 計算式内の集計・非集計の一致」

画像9
~ 2024年7月 Tableau Version 2024.2対応済み ~

「集計と非集計 その3」。今回は、計算式の中で、集計と非集計を混ぜてしまったり、集計計算の結果をまた集計しようとしてしまった時の解説をさせて頂きます。

なお、「集計と非集計 その1」「集計と非集計 その2」はこちらです。


「集計と非集計 その1」では、集計計算の例として[利益率]という計算式

SUM ( [利益] ) / SUM ( [売上] )

を作成しました。

この計算式 [利益率] を作るときに間違えて、

SUM ( [利益] ) / [売上]

と、SUM ( [売上] ) にするのを忘れてしまったとします。
すると

画像1

このようにエラーメッセージが出ます。

何と書かれているかというと、
「この関数の集計および非集計の引数を混在させることはできません。」
と書かれています。

このエラーは、Tableauで計算式を作っている時に目にするエラーの中でも、1,2位を争うほど発生頻度の高いエラーです。私も数えきれないぐらい目にしてきました。

このエラーを分かりやすく言い換えると
「集計と非集計を混ぜないで下さい。集計するなら集計で、非集計なら非集計で統一して下さいね。」
という意味になります。

この例ですと、
SUM([利益])の方は、データの切り口=「粒度」によってデータ全体を切り分け、その中で複数のレコードを集計(合計)した一つの値になっています。
一方、それを割る[売上]はレコード(行)毎に違う値になっています。

イメージで示すと、下図になります。

画像11

Tableauの気持ちを代弁すると、
「売上で割るといっても、いったい、どの レコードの数値で割って良いのか分かりません。」
このような表現になります。

さて、このようにひとつの計算式の中に、あきらかに集計と非集計を混ぜてしまった場合は、何が間違いなのか気づきやすいです。

しかし、集計、非集計に関するエラーには、次のように原因に気づきにくい場面もあります。

今、正しく作成された[利益率]

画像2

を用いて、
「利益率が0.1% = 10% を超えていたら”利益率大”、そうでない場合は”利益率小”」
という判定を行う計算式を作るとします。

以下の計算式です。これで、正しい計算式になっています。

画像3

この計算式には、SUM()や、AVG()という集計の関数は入っていません。
なので、ぱっと見た時には非集計の計算かな?と感じてしまうところですが、実は集計計算です。

なぜなら、[利益率]というフィールドを作る段階で既に、集計が行われているためです。

なので、この[利益率大小]を作るとき、粒度毎に集計したいから・・と考え

画像4


このように、[利益率]にAVG()をつけて、AVG([利益率])などにしてしまうと、
エラー「AVGへの引数(集計関数)は既に集計であり、さらに集計することはできません。」が発生します。

集計した値に、さらに集計を行う事は出来ません。
(表計算やLOD計算というものを使った場合は一部例外ありますが、それらについては、別途解説いたします。)

また、この[利益率]を用いて、もう一度、利益を再計算するような計算式を作ったとします。(もともと、利益というフィールドがあるので、この計算式の必要性は全くないですが、その点は説明のためとしてご容赦下さい。)

画像5

[利益率]*[売上]で、なんとなく正しいように見えますが、
[利益率]は集計、何も集計していない[売上]は非集計なので、これらを混在させる事は出来ません。

もし、どうしてもこの計算式を作りたい場合は

画像6

このように、集計同士であわせる必要があります。

以上、集計非集計に関わる計算式のエラーを紹介いたしました。

最後は、IF分と集計が関わる場合の例を紹介します。
今、下記のような計算式を作りました。

画像7

粒度=切り口でデータを切り分け、その粒度内のデータのカテゴリが家電の場合のみ、利益率を求めるという計算式です。

利益率は集計ですが、[カテゴリ]は非集計です。
このような形で、IF分の条件式部分と、THEN以降の結果部分に、集計、非集計を混在させるとエラーとなってしまいます。
これを回避するために、よく使われるのがATTR関数( = 「属性」)です。

画像8

このようにします。
(ATTR関数 については、「集計と非集計その2」で解説しています。)

これで、
粒度で=切り口で切り分けた部分のデータの「カテゴリ」が皆、「家電」であれば、利益率を返すという計算式になります。

このように、「ATTR」は集計、非集計をあわせ、エラーを回避するためにも良く使われます。

*補足
なお、ATTRの代わりに、MINやMAXを用いることも可能です。パフォーマンス上はMINやMAXの方が速いです。ただ、後から見た時に意図が分かり易いという意味で、個人的にはATTRを使う場合も多いです。

もし、IF分作っているの中で、上記のエラーに遭遇したら思い出してみて下さい。

なお、IF文と、集計、非集計については、こちらのWebサイトも参考になりますので紹介させて頂きます。
エクスセンチュア社ブログ


以上、「集計と非集計」の解説はこれで終了となります。
ご精読ありがとうございます。

連載記事、次のテーマは下記「クエリパイプライン(オーダーオブオペレーション)」です。

*連載記事すべてへのリンクは、こちらのマガジンにまとめています。

By ritz_Tableau
2020-2023 Tableau Zen Master | 2019-2021,2023 Tableau Public Ambassador |2021 certified as Tableau Certified Professional | DATA Saber
X(Twitter) : @ritz_Tableau
Tableau Public : https://public.tableau.com/profile/satoshi.ganeko#!/
*記事の中に不正確な点などありましたら、是非、X(Twitter) Direct Messageでお知らせ下さい。よろしくお願いします。m(__)m

画像10

おことわり

当記事のコンテンツについて、商用利用でない場合は許可なく転載して頂いて構いません。(ハードル画像および他のサイトから引用している画像は除く)
転載の際は、当記事へのリンクを掲載し転載であることを明記してください。商用利用の場合は許可なく転載しないで下さい。
当記事のコンテンツについて、可能な限り正確な情報を掲載するよう努めていますが、誤情報が含まれたり、情報が古くなっている可能性があります。当記事に掲載された内容、および、当記事からリンクやバナーによって移動したサイトに掲載された内容によって生じた、損害等の一切の責任を負いかねますのでご了承ください。よろしくお願いします。




この記事が気に入ったらサポートをしてみませんか?