📊

スライサーで動的に小数の桁数を変更する

2024/02/26に公開

はじめに

ユーザーの使用シーンによって、同じデータでも表示桁数を変えて見たい時がある。例えば全体の大まか状況を把握する際は数字が細かすぎると見づらいので、小数点以降をなくしたいけど、一部の細かい状況を深掘りしたい時、逆に小数点以降の桁数が多い方がいい。
ただしそのためにビジュアルを分けたり、あるいは詳細ページを作ったりすると、レポートの構成が不必要に複雑になる場合もあるので、ユーザー自身がスライサーで動的に小数の桁数を変更したい時がある。

スライサーで動的に小数の桁数を変更する方法

スライサーで動的に小数の桁数を変更したい場合、2023年3月時点の方法としてDAX関数ROUNDとカスタム書式を組みわせることで実現可能である。またプレビュー機能(2023年4月時点)であるダイナミック書式(動的書式)を使うことで実現することも可能である。

各実現方法の詳細

実現方法1:ROUND関数とカスタム書式の組みわせる

前提条件

小数の元データの桁数が十分である必要がある。
例えば8桁の小数を2桁と4桁の間で切り替えることはできるが、1桁の小数を2桁と4桁の間で切り替えることはできない。
1桁の小数を2桁と4桁の間で切り替えるなど、小数の元データの桁数が不十分な場合は、後述のダイナミック書式で実現することが可能である。

実現方法

  1. 集計するメジャーを作成し、そのメジャー内でスライサーの選択によってROUND関数で集計結果を対応する桁数に四捨五入する。
    例えば下記図のメジャーは「Table小数」テーブルの「Value」列(値は全部8桁以上の小数)を合計するもので、更にスライサーの選択によって合計値を小数点後2桁または4桁に四捨五入している。「MapSelection」は選択肢用のDimensionテーブルである。

    メジャー

  2. ステップ1で作成したメジャーの書式をカスタム書式に設定する。下記図は一例である。

    メジャーフォーマット

ROUND関数とカスタム書式の細かい解説については後述。

DAX関数ROUND

ROUND関数
ROUND(<number>, <num_digits>)

https://learn.microsoft.com/ja-jp/dax/round-function-dax

Excelでお馴染みのROUND関数と全く同じものである。
numberをnum_digitsで指定した桁数に四捨五入するが、桁数を増やすことはできない。また四捨五入の結果後ろが0の場合、0の桁は切り捨てられる。
下記は同じように小数点以下1桁に四捨五入した結果である。

ROUND関数
ROUND(1.234, 1)
//結果:1.2

ROUND(1, 1)
//結果:1
//桁数を増やすことはできない。

ROUND(1.20001, 2)
//結果:1.2
//四捨五入の結果後ろが0の場合、0の桁は切り捨てられる。

Power BIの小数の書式設定

フィールドやメジャーなどに対し、必ず何かしらの書式が設定されている。
こちらも概ねExcelの仕様と同じである。まずはフィールドやメジャーの値の計算が終わってから、書式の設定を適用する。
つまりメジャー内でROUND関数で四捨五入した場合、四捨五入した結果に対し、更にこのメジャーの書式設定が適用される。

スタンダードな書式

Power BIのリボンの書式設定メニューで値が小数であるフィールドやメジャーの書式を「10進数」にし、任意の小数点後の桁数を指定することができる。

スタンダードな書式

ROUND関数と違って、元データの桁数が足りなくても、指定した桁数になるのように0埋めしてくれる。(例:小数点以下8桁指定で、元の値が1.234の場合、1.23400000になる)

カスタム書式

ここでは主に数字の桁数をカスタマイズする時によく使うカスタム書式を紹介する。
日付などのその他のカスタム書式の書き方は以下が参考になる。

https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-custom-format-strings

カスタム書式を指定する文字列の書き方

数字の桁数を設定する記号は主に「0」、「#」と「.」である。これらを組み合わせてカスタム書式を指定する文字列を書く。
「.」は小数点の位置を示すのもので、単独では使用しない。
「0」は元データのその桁に数字があればそのまま数字を表記し、数字がなければ0を表記することを示す記号である。
「#」は元データのその桁に数字があればそのまま数字を表記し、数字がなければ表記しないことを示す記号である。
ただし:

  1. 「0」でも「#」でも、小数の桁数を縮める場合、切り捨てではなく四捨五入である。
  2. 「0」でも「#」でも、書かないことで整数部分の桁を減らすことができない。
  3. 小数点以降で「#」の後ろに「0」を書くと、「#」が「0」として動作する。
  4. 整数部分で「#」の前に「0」を書くと、「#」が「0」として動作する。

以下は一部の例である。

元データ カスタム書式文字列 出力結果
1234.567 0 1235
1234.567 # 1235
1234.567 0.0 1234.6
1234.567 0.# 1234.6
1234.567 0.00000 1234.56700
1234.567 0.##### 1234.567
1234.567 0.0000# 1234.5670
1234.567 0.####0 1234.56700
1234.567 #.0 1234.6
1234.567 ######.0 1234.6
1234.567 000000.0 001234.6
1234.567 0#####.0 001234.6

カスタム書式の設定方法

  • 方法1
    Power BIのリボンの書式設定メニューの書式欄に直接カスタム書式文字列を入力してからENTERを押す。

    カスタム書式

  • 方法2
    モデルビューに切り替え、該当テーブルから該当フィールドまたはメジャーを選択した状態で、右のプロパティパネルの書式を「カスタム」に変更し、更に一番下の欄にカスタム書式文字列を記入する。
    ※Desktop版のバージョンによっては、書式「全般」を「カスタム」に直接変更すると「全般」に戻されるバグが発生するので、その際は最新バージョンをインストールするか、1回「10進数」などに変更してから「カスタム」に変更してください。

    プロパティ

なぜDAX関数ROUNDとカスタム書式の片方では実現できないのか

  • カスタム書式のみの場合、閲覧者が特定のフィールドのカスタム書式をスライサーなどと連動して変えることはできない。
    ※一応該当フィールドのコピーを必要数作成し、それぞれのフィールドのカスタム書式を設定してから、フィールドパラメーターとスライサーを組み合わせて実現する方法もあるが、非常に煩雑である。
  • DAX関数ROUNDで四捨五入するメジャーのみの場合、そのメジャーに適用されるスタンダードな書式設定が作用するので、ROUNDで指定した桁数に合わせて表示する桁数を変えることができない。
    ※書式「全般」で桁数が「自動」でも、ROUNDの結果に合わせて調整してくれない。

実現方法2:ダイナミック書式

2023年4月リリースバージョンからパブリックプレビュー開始のダイナミック書式を使う方法である。
ダイナミック書式は、言わば条件分岐などで複数のカスタム書式間で切り替えられる機能である。

https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-dynamic-format-strings

前提条件

「設定」⇒「プレビュー機能」の中の「メジャーの動的形式文字列」をONにする必要がある。
※項目名では「文字列」となっているが、別に何でもかんでも「文字列」型として出力するわけではないので、この記述は無視してください。

動的形式文字列

現段階ではまだプレビュー機能であり、不具合が発生する可能性が通常機能よりも高いことを理解した上で検討してください。

実現方法

メジャーに限って、書式設定の選択肢に「ダイナミック」が追加される。

ダイナミック書式

「ダイナミック」を選択すると、コード入力欄がダイナミック書式用に変わり、そこに通常のメジャーみたいにIF関数などでカスタム書式を選ぶコードを書くことが可能である。

ダイナミック書式コード

またコード入力欄の一番左に「書式」と「メジャー」のコードを切り替えるドロップダウンメニューが追加された。

参考

https://learn.microsoft.com/ja-jp/dax/round-function-dax

https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-custom-format-strings

https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-dynamic-format-strings

BIによる業務改善推進

Discussion