Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
Ochanoko
Creator
Creator

棒チャートで、一番値の大きい棒にだけ特別な配色がしたい

引き続きお世話になります。

クリックセンスにて、棒チャートで一番値の大きい棒にだけ特別な配色をしたいと考えております。

棒グラフは顧客の購入回数を軸とし、それぞれの販売価格の合計を高さとしています。

詳しくは下にある画像をご覧ください。

普段この動作を実現しようとすると

If(Rank(Aggr(高さ,軸)) = 1,一位の色,それ以外の色)

という数式を指定して配色しているのですが、今回の場合、

If(Rank(Aggr(Sum(販売価格),Aggr(Count(Distinct 伝票番号),顧客コード))) = 1,一位の配色,それ以外の配色)

という形になってしまい、Aggrの軸に数式を使う形になってしまうので、このやり方では実現できません。

他にどのようなやり方があるかお教えいただけませんでしょうか?

haisyoku.png

 

1 Solution

Accepted Solutions
hka
Employee
Employee

複雑な数式になってしまいますが、プレゼンテーションの色と凡例の部分の色の設定で

”数式を使用"にして以下の数式を使用すればできると思いますので確認してみてください。

if(sum(販売価格)=rangemax(Below(total sum([販売価格]),0,count(total aggr(count(distinct 伝票番号),[顧客コード]))),above(total sum([販売価格]),0,count(total aggr(count(distinct 伝票番号),[顧客コード])))),Color(2),Color(1))

 

rangemax、bellowとabove関数を使用して範囲内の最大値を算出してsum(販売価格)と一致するものを

Color(2),それ以外はColor(1)としています。

BellowとAboveを併用しているのは、1つだけの使用だと先頭、もしくは最後の結果がそのままの値に

なってしまうためです。

View solution in original post

6 Replies
hka
Employee
Employee

複雑な数式になってしまいますが、プレゼンテーションの色と凡例の部分の色の設定で

”数式を使用"にして以下の数式を使用すればできると思いますので確認してみてください。

if(sum(販売価格)=rangemax(Below(total sum([販売価格]),0,count(total aggr(count(distinct 伝票番号),[顧客コード]))),above(total sum([販売価格]),0,count(total aggr(count(distinct 伝票番号),[顧客コード])))),Color(2),Color(1))

 

rangemax、bellowとabove関数を使用して範囲内の最大値を算出してsum(販売価格)と一致するものを

Color(2),それ以外はColor(1)としています。

BellowとAboveを併用しているのは、1つだけの使用だと先頭、もしくは最後の結果がそのままの値に

なってしまうためです。

Ochanoko
Creator
Creator
Author

ありがとうございます。

数式を当てはめたところ、思ったような結果が得られました。

問題はこれで解決したのですが、Rangemaxの引数に何を指定してるのか私にはよくわかりませんでした。

なぜ、Below(total sum(販売価格),0,Count(total aggr(count(distinct 伝票番号),顧客コード)))でグラフと同じ値を取得できるのか?

↑この数式は理解できました。

なぜ、BelowとAboveを併用しなければ、先頭、もしくは最後の結果がそのままの値になってしまうのか?

なぜ、BelowとAboveを併用すればそれを回避できるのか?

厚かましいお願いですが、教えていただけないでしょうか? 

Rangemax.png

 

hka
Employee
Employee

rangemax関数は、関数内で出力される数値の最大値を取ります。

rangemax(sum(A),sum(B),Sum(C))のような記述を行うとsum(A),Sum(B),Sum(C)の中で一番大きい値を返します。

例えばrangemaxとbellowやaboveを使用すると、bellow、aboveで指定された範囲の値の中の最大値を返します。

下図のようにテーブルでsumとbellow、aboveを表示させるとわかりますが、

数式をbellowのみ、aboveのみにした場合、最大値が取れない可能性があります。

最大値を持つ顧客を境にbellowでは下、aboveでは上の行で全体の最大値が表示されません。

そのため、bellowとaboveを組み合わせて最大値を出力できるようにしました。

こちらで如何でしょうか。

bellowabove.png

最初の回答で最初と最後の数値の件について記述しましたが、間違いでした。

Ochanoko
Creator
Creator
Author

ありがとうございます。

Rangemaxに同じ軸に対する集計を複数渡した場合、複数の集計から軸ごとに最大値のものを返すんですね。

Belowとaboveを併用する必要があることはよくわかりました。

テーブルを見るに、bellowではテーブルを上から下に、aboveでは下から上に集計を行っているように見受けら

れますが、たしかに最大値を持つ顧客を境に全体の最大値が表示されていませんね。

そもそもなぜ、最大値を持つ顧客を境に全体の最大値が表示されなくなるんでしょうか。

値を見るに最大値を境としてグループ分けしているように見受けられますがそれ以外は私には分かりませんでした。

度々の質問で申し訳ありませんが、お教え頂けますでしょうか。

 

 

hka
Employee
Employee

下記ヘルプのabove、belowの説明を参照ください。

https://help.qlik.com/ja-JP/sense/June2019/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/InterReco...

belowは現在の位置から設定された数値分下の値を見に行く関数で、aboveは上の値を見に行く関数です。

range(sum,max,minなど)関連の関数との連携で範囲を指定することが可能になります。

below(sum(販売価格),0,顧客数)の場合、自分自身の位置から顧客数分下の範囲の数値を参照します。

この場合、下の顧客になるにつれて参照する範囲が少なくなります。

1番上の顧客が10個下まで参照しているとすると2番目は9個下、3番目は8個下となります。

これは1番目の顧客は一番下の顧客までの数が10に対し、2番目の顧客は一番下の顧客までの数が9になるためです。

belowで使用している顧客数は軸で表示されている顧客数になります。(数式ではcount(aggr(count()))の部分です。)

これは一番下の顧客までの範囲を参照する最大値です。(1番上の顧客からは顧客数分範囲指定が必要なため)

belowは自分自身のセルから下の数値しか参照しないので、最大値を持つ顧客より下の場合、その下の範囲での最大値が表示されています。aboveは逆方向の参照になります。

Ochanoko
Creator
Creator
Author

「1番上の顧客が10個下まで参照しているとすると2番目は9個下、3番目は8個下となります。」

この動作が自分の頭から抜けてました。言われてみれば確かにこういう動作になりますね。

ようやく今回の内容について完全に理解することができました。

ありがとうございました😀