Power BI Desktop でのデータ型
この記事では、Power BI Desktop と Data Analysis Expressions (DAX) でサポートされるデータ型について説明します。
Power BI は、データを読み込むとき、ソース列のデータ型を、より効率的なストレージ、計算、データ視覚化をサポートするデータ型に変換しようとします。 たとえば、Excel からインポートする値の列に小数部の値が含まれない場合は、Power BI Desktop により、そのデータ列が整数を格納するのに適した整数データ型に変換されます。
一部の DAX 関数はデータ型について特別な要件を持つため、どのデータ型に変換されるかは重要です。 多くの場合、DAX はデータ型を暗黙的に変換しますが、そうでない場合もあります。 たとえば、日付データ型が必要な DAX 関数に対して、列のデータ型がテキストであると、DAX 関数は正しく機能しません。 そのため、列に正しいデータ型を使うことが重要であり役に立ちます。
列のデータ型を確認および指定する
Power BI Desktop では、Power Query エディター、データ ビュー、またはレポート ビューで列のデータ型を確認および指定することができます。
Power Query エディターでは、列を選択してから、リボンの [変換] グループで [データ型] を選びます。
データ ビューまたはレポート ビューでは、列を選んでから、リボンの [列ツール] タブで [データ型] の横にあるドロップダウン矢印を選びます。
Power Query エディターでの [データ型] ドロップダウンの選択には、データ ビューまたはレポート ビューには存在しない [日付/時刻/タイムゾーン] および [期間] という 2 つのデータ型が含まれています。 これらのデータ型を含む列を Power BI モデルに読み込むと、日付/時刻/タイムゾーンの列は日付/時刻データ型に変換され、期間の列は 10 進数データ型に変換されます。
バイナリ データ型は、Power Query エディター以外ではサポートされていません。 Power Query エディターでは、他のデータ型に変換してから Power BI モデルに読み込む場合、バイナリ ファイルを読み込むときにバイナリデータ型を使用できます。 [バイナリ] 選択肢は、従来版に対応するためにデータ ビューとレポート ビューのメニューに存在しますが、Power BI モデルにバイナリ列を読み込もうとすると、エラーが発生する可能性があります。
数値型
Power BI Desktop では、10 進数、固定小数点数、整数の 3 つの数値型がサポートされています。
表形式オブジェクト モデル (TOM) の列の DataType プロパティを使って、数値型の DataType 列挙型を指定できます。 Power BI のオブジェクトをプログラムで変更する方法について詳しくは、表形式オブジェクト モデルを使用した Power BI データセットのプログラミングに関する記事をご覧ください。
10 進数
10 進数は最も一般的な数値型であり、小数値と整数を含む数値を処理できます。 10 進数は、64 ビット (8 バイト) の浮動小数点数で、-1.79E +308 から -2.23E -308 までの負の値、2.23E -308 から 1.79E +308 までの正の値、および 0 を表します。 34、34.01、34.000367063 などの数値は、有効な 10 進数です。
10 進数型で表すことができる最も高い精度は 15 桁です。 小数点区切り文字は、数値内の任意の位置に置くことができます。 この型は Excel での数値の格納方法に対応し、TOM ではこの型を DataType.Double
列挙値で指定します。
固定小数点数
固定小数点数データ型は、小数点区切り文字の位置が固定されています。 小数点区切り文字の右側は常に 4 桁であり、有効数字は最大 19 桁です。 固定小数点数で表すことができる最大値は、正または負の 922,337,203,685,477.5807 です。
固定小数点数型は、丸め処理で誤差が発生する可能性がある場合に便利です。 小さい小数部の値を持つ数値は、小数部が累積して数値が少しずれることがあります。 固定小数点数型は、小数点区切り文字の右側 4 桁より小さい値は切り捨てられることで、この種の誤差を回避するのに役立ちます。
このデータ型は SQL Server の Decimal (19,4)、または Analysis Services と Excel の Power Pivot の通貨データ型に相当します。 TOM では、この型を DataType.Decimal
列挙値で指定します。
整数
整数は、64 ビット (8 バイト) の整数値を表します。 これは、整数なので、小数点の右側に桁はありません。 この型は、-9,223,372,036,854,775,807 (-2^63+1) から 9,223,372,036,854,775,806 (2^63-2) までの 19 桁の正または負の整数に対応できるので、数値データ型で可能な最大の値を表すことができます。
固定小数点数型と同じように、丸め処理を制御する必要がある場合に整数型が便利です。 TOM では、整数データ型 を DataType.Int64
列挙値で表します。
注意
Power BI Desktop のデータ モデルは、64 ビットの整数値をサポートしていますが、JavaScript の制限のため、Power BI の視覚エフェクトで安全に表現できる最大の数は 9,007,199,254,740,991 (2^53-1) です。 データ モデルにそれより大きい数値がある場合は、視覚エフェクトに追加する前に、計算によってサイズを小さくできます。
数値型の計算の精度
10 進数データ型の列の値は、浮動小数点数に関する IEEE 754 標準に従って "近似" データ型として格納されます。 近似データ型の精度には固有の制限があります。これは、正確な数値を格納する代わりに、極めて近い (丸められた) 近似値を格納することがあるためです。
浮動小数点値が浮動小数点の桁数を確実に定量化できない場合、精度の損失 ("誤差") が発生する可能性があります。 誤差の可能性は、報告シナリオによっては、予期しない、または不正確な計算結果として現れることがあります。
10 進数データ型の値の間での等値関連の比較計算では、予期しない結果が返される可能性があります。 等値比較には、等しい =
、より大きい >
、より小さい <
、より大きいか等しい >=
、より小さいか等しい <=
が含まれます。
この問題は、DAX 式で RANKX 関数を使う場合に最も顕著で、結果が 2 回計算され、わずかに異なる数値が得られます。 レポート ユーザーは 2 つの数値の違いに気づかないかもしれませんが、ランク結果は著しく不正確になる場合があります。 予期しない結果を避けるには、列のデータ型を 10 進数から固定小数点数または整数に変更するか、ROUND を使って強制的に丸めを行います。 固定小数点数データ型は、小数点記号の右側が常に 4 桁であるため、精度が高くなります。
まれに、10 進数データ型の列の値を合計する計算で、予期しない結果が返されることがあります。 この結果は、正数と負数の両方が多い列で発生する可能性が最も高くなります。 合計の結果は、その列の行全体の値の分布に影響を受けます。
必要な計算で、正数の大部分を合計してから負数の大部分を合計する場合、最初の大きな正数部分の合計によって、結果が歪む可能性があります。 正数と負数のバランスがよい加算の計算では、クエリの精度が高くなり、より正確な結果が返されます。 予期しない結果を避けるには、列のデータ型を 10 進数から固定小数点数または整数に変更します。
日付/時刻型
Power BI Desktop では、Power Query エディターで 5 つの日付/時刻データ型がサポートされています。 日付/時刻/タイムゾーンと期間のどちらも、Power BI Desktop データ モデルへの読み込みの間に変換されます。 このモデルでは、日付/時刻がサポートされています。または、値を個別に日付または時刻として書式設定できます。
日付/時刻は、日付と時刻の両方の値を表します。 基になる日付/時刻値は、10 進数型として格納されるので、2 つの型の間で変換できます。 時刻部分は、1/300 秒 (3.33 ミリ秒) の整数倍の分数として保存されます。 このデータ型では、1900 年から 9999 年までの日付がサポートされています。
日付は日付だけを表し、時刻部分はありません。 日付は、小数部分に 0 が入った日付/時刻値としてモデルに変換されます。
時刻は、日付部分のない時刻のみを表します。 時刻は、小数点の左側に桁がない日付/時刻値としてモデルに変換されます。
日付/時刻/タイムゾーンは、UTC の日付/時刻とタイムゾーン オフセットを表し、モデルに読み込まれるときに日付/時刻に変換されます。 Power BI モデルは、ユーザーの場所とロケールに基づいてタイムゾーンが調整されることはありません。 米国のモデルに読み込まれた 09:00 という値は、レポートがどこで開かれたり表示されたりしても、09:00 と表示されます。
期間は時間の長さを表し、モデルに読み込まれるときに 10 進数型に変換されます。 10 進数型なので、日付/時刻の値を加算または減算すると正しい結果が得られ、大きさを示す視覚エフェクトで値を簡単に使用できます。
テキスト型
テキスト データ型は Unicode 文字のデータ文字列で、文字、数字、またはテキスト形式で表される日付を使用できます。 文字列の最大長は 268,435,456 Unicode 文字 (256 メガ文字) または 536,870,912 バイトです。
Power BI がテキスト データを格納する方法により、特定の状況でデータの表示が異なる場合があります。 次のセクションでは、Power Query エディターでデータのクエリを実行したときと、Power BI に読み込むときで、テキスト データの外観が若干変化する可能性がある一般的な状況について説明します。
大文字小文字の区別
Power BI でデータの格納とクエリを行うエンジンでは、"大文字と小文字の区別がなく"、大文字の使い分けが異なる文字が同じ値として扱われます。 "A" は "a" と等しくなります。 一方、Power Query では "大文字と小文字の区別があり"、"A" は "a" と同じではありません。 大文字と小文字の区別の違いにより、Power BI への読み込み後に、テキスト データの大文字化が一見不可解に変更される場合があります。
注文データの例を次に示します。OrderNo 列は注文ごとに一意であり、Addressee 列は注文時に手入力された住所の名前を示します。 Power Query エディターでは、システムに入力された Addressee の名前は同じである複数の注文が、異なる大文字化で示されています。
Power BI がデータを読み込んだ後、[データ] タブでの重複する名前の大文字化は、元のエントリから、大文字化のバリエーションのいずれかに変わります。
この変更は、Power Query エディターでは大文字と小文字が区別されるため、ソース システムに格納されているとおりにデータが表示されるために発生します。 Power BI にデータを格納するエンジンでは大文字と小文字が区別されないため、文字の小文字と大文字のバージョンは同じものとして扱われます。 Power BI エンジンに読み込まれる Power Query のデータは、それに応じて変わる可能性があります。
Power BI エンジンは、データを読み込むとき、各行を個別に先頭から評価します。 テキスト列 (Addressee など) ごとに、エンジンは一意の値の辞書を格納します。これはデータ圧縮によるパフォーマンスを向上させるためです。 エンジンでは、Addressee 列の最初の 3 つの値が一意と見なされ、辞書に格納されます。 エンジンでは大文字と小文字が区別されないため、その後、名前は同一として評価されます。
エンジンは、名前 "Taina Hasu" を "TAINA HASU" および "Taina HASU" と同じ名前と見なすため、それらのバリエーションを格納せず、格納された最初のバリエーションを参照します。 名前 "MURALI DAS" が大文字で表示されるのは、エンジンがデータを上から下に読み込んだときに初めて評価した名前の表記であるためです。
次の図は、評価プロセスを示したものです。
前の例で、Power BI エンジンは最初のデータ行を読み込み、Addressee の辞書を作成して、それに Taina Hasu を追加します。 また、エンジンは読み込んだテーブルでの Addressee 列にあるその値への参照を追加します。 エンジンは 2 行目と 3 行目に対して同じ処理を行います。これらの名前は、大文字と小文字を区別しなくても他の行と同じではないためです。
4 行目で、エンジンは値を辞書内の名前と比較して、名前を見つけます。 エンジンは大文字と小文字を区別しないので、"TAINA HASU" と "Taina Hasu" は同じです。 エンジンは新しい名前を辞書に追加するのではなく、既存の名前を参照します。 残りの行についても同じプロセスが行われます。
注意
Power BI でデータの格納とクエリを行うエンジンでは大文字と小文字が区別されないため、大文字と小文字を区別するソースを DirectQuery モードで処理するときは特に注意してください。 Power BI では、ソースが重複する行を除去しているものと想定しています。 Power BI は大文字と小文字を区別しないため、大文字と小文字のみが異なる 2 つの値を重複として扱いますが、ソースではそのように扱わない場合があります。 このような場合、最終的な結果は不定です。
このような状況を回避するには、大文字と小文字を区別するデータ ソースで DirectQuery モードを使う場合は、ソース クエリまたは Power Query エディターで大文字と小文字の使い分けを正規化します。
先頭と末尾の空白
Power BI エンジンでは、テキスト データの後にある末尾の空白は自動的にトリミングされますが、データの前にある先頭の空白は削除されません。 混乱を避けるため、先頭または末尾に空白が含まれるデータを処理するときは、Text.Trim 関数を使って、テキストの先頭または末尾の空白を削除する必要があります。 先頭の空白を削除しない場合、重複する値が原因でリレーションシップの作成が失敗したり、視覚エフェクトから予期しない結果が返されたりする可能性があります。
次の例で示す顧客に関するデータでは、Name 列には顧客の名前が含まれ、Index 列はエントリごとに一意です。 わかりやすいように、名前は引用符で囲まれています。 顧客名は 4 回繰り返されていますが、そのたびに先頭と末尾の空白の組み合わせが異なります。 これらのバリエーションは、長時間にわたる手動データ入力で発生する可能性があります。
行 | 先頭のスペース | 末尾のスペース | 名前 | インデックス | テキストの長さ |
---|---|---|---|---|---|
1 | いいえ | いいえ | "Dylan Williams" | 1 | 14 |
2 | いいえ | はい | "Dylan Williams " | 10 | 15 |
3 | はい | いいえ | " Dylan Williams" | 20 | 15 |
4 | はい | はい | " Dylan Williams " | 40 | 16 |
Power Query エディターでは、結果のデータは次のように表示されます。
データを読み込んだ後で Power BI の [データ] タブに移動すると、同じテーブルが次の図のように表示されます。行数は前と同じです。
ただし、このデータに基づく視覚化では、2 つの行だけが返されます。
上の図で、最初の行の Index フィールドの合計値は 60 であるため、この視覚エフェクトの最初の行は、読み込まれたデータの最後の 2 行を表します。 Index の合計値が 11 である 2 行目は、最初の 2 行を表します。 視覚エフェクトとデータ テーブルで行数が違うのは、エンジンは末尾の空白を自動的に削除つまりトリミングしますが、先頭の空白は削除しないためです。 そのため、エンジンは 1 行目と 2 行目、および 3 行目と 4 行目を同じものとして評価し、視覚エフェクトはこれらの結果を返します。
この動作により、重複する値が検出されるため、リレーションシップに関連するエラー メッセージが発生する可能性もあります。 たとえば、リレーションシップの構成によっては、次の図のようなエラーが表示される場合があります。
他の状況では、重複する値が検出されるため、多対 1 または 1 対 1 のリレーションシップを作成できない場合があります。
これらのエラーは先頭または末尾の空白まで遡ることができ、解決するには、Text.Trim または [変換] の [トリミング] を使って、Power Query エディターで空白を削除します。
True/False 型
True/False データ型は、True または False のブール値です。 最適で最も一貫性のある結果を得るため、ブール値 true/false の情報を含む列を Power BI に読み込むときは、列の型を True/False に設定します。
Power BI では、特定の状況でデータが異なる方法で変換され、表示されます。 このセクションでは、ブール値を変換する一般的なケースと、Power BI で予期しない結果が生じる変換への対処方法について説明します。
この例では、顧客がニュースレターにサインアップしたかどうかに関するデータを読み込みます。 TRUE という値は顧客がニュースレターにサインアップしていることを示し、FALSE という値は顧客がサインアップしていないことを示します。
ただし、Power BI サービスにレポートを発行すると、ニュースレターのサインアップ状態列は、予期される TRUE または FALSE の値ではなく、0 と -1 で表示されます。 次の手順では、この変換がどのように行われるか、およびそれを回避する方法について説明します。
次の画像には、このテーブルに対するシンプルなクエリが示されています。
Subscribed To Newsletter 列のデータ型は [任意] に設定されており、その結果、Power BI はデータをテキストとしてモデルに読み込みます。
顧客ごとの詳細情報を示す単純な視覚エフェクトを追加すると、Power BI Desktop 内と Power BI サービスに発行されたときの両方で、視覚エフェクトに期待どおりのデータが表示されます。
ただし、Power BI サービスでデータセットを最新の情報に更新すると、視覚エフェクトの Subscribed To Newsletter 列には、値が TRUE または FALSE ではなく、-1 と 0 として表示されます。
Power BI Desktop からレポートを最新の情報に更新すると、Subscribed To Newsletter 列には再度 TRUE または FALSE が予想どおりに表示されますが、Power BI サービスで最新の情報に更新すると、値は再度変更されて -1 と 0 が表示されます。
このような状況にならないようにするための解決方法は、ブール値の列を Power BI Desktop で True/False 型に設定して、レポートを再発行することです。
変更すると、視覚エフェクトでの Subscribed To Newsletter 列の値の表示が少し変わります。 テーブルに入力されたすべて大文字のテキストではなく、最初の文字のみが大文字になります。 この変化は、列のデータ型を変更した結果の 1 つです。
データ型を変更して、Power BI サービスに再発行し、最新の情報に更新すると、レポートの値は期待したとおりに True または False として表示されます。
まとめると、Power BI でブール値のデータを操作するときは、必ず Power BI Desktop で列を True/False データ型に設定します。
空白型
Blank は、SQL の null を表し、それを置き換える DAX のデータ型です。 BLANK 関数を使用すると、空白を作成できます。空白かどうかをテストするには、ISBLANK 論理関数を使用します。
binary 型
バイナリ データ型を使うと、任意のデータをバイナリ形式で表すことができます。 Power Query エディターでは、他のデータ型に変換してから Power BI モデルに読み込む場合、バイナリ ファイルを読み込むときにこのデータ型を使用できます。
バイナリ列は、Power BI データ モデルではサポートされていません。 [バイナリ] 選択肢は、従来版に対応するためにデータ ビューとレポート ビューのメニューに存在しますが、Power BI モデルにバイナリ列を読み込もうとすると、エラーが発生する可能性があります。
注意
バイナリ列がクエリのステップの出力に含まれている場合、ゲートウェイを介してデータを更新しようとすると、エラーが発生することがあります。 クエリの最後のステップとして、バイナリ列を明示的に削除することをお勧めします。
テーブルの種類です。
DAX では、集計やタイム インテリジェンス計算など、多くの関数でテーブル データ型を使用します。 一部の関数では、テーブルへの参照が必要です。 他の関数からは、他の関数への入力として使用できるテーブルが返されます。
入力としてテーブルを必要とするいくつかの関数では、テーブルに評価される式を指定できます。 一部の関数では、ベース テーブルへの参照が必要です。 特定の関数の要件については、「DAX 関数リファレンス」をご覧ください。
暗黙的および明示的なデータ型の変換
各 DAX 関数には、入力および出力として使用するデータの型に関する特定の要件があります。 たとえば、一部の引数では整数が必要で、他の引数では日付が必要な関数があります。 他に、テキストまたはテーブルが必要な関数があります。
引数として指定した列に含まれるデータに、関数で必要なデータ型との互換性がない場合、DAX でエラーが返される可能性があります。 ただし、DAX は、可能な限り、データを必要なデータ型に暗黙的に変換しようとします。
たとえば次のような点です。
- 日付を文字列型にした場合、DAX によって文字列が解析され、Windows の日付と時刻の形式のいずれかとしてのキャストが試みられます。
- TRUE + 1 という加算を行うことができ、結果は 2 になります。これは、DAX は TRUE を数値 1 に暗黙的に変換して、演算 1+1 を行うためです。
- 2 つの列の値を加算するとき、1 つの値がテキスト ("12") で表され、もう 1 つが数値 (12) で表されている場合は、DAX によって文字列が数値に暗黙的に変換され、数値の結果に対して加算が行われます。 式 = "22" + 22 からは、44 が返ります。
- 2 つの数値を連結しようとすると、DAX によってそれらの数値が文字列表現に変換されてから、連結されます。 式 = 12 & 34 からは、"1234" が返ります。
暗黙的なデータ変換のテーブル
演算子は、要求された演算を行う前に、必要な値をキャストすることによって、DAX が実行する変換の種類を決定します。 次のテーブルは、一連の演算子と、各セルで交差している 2 つのデータ型について、DAX で行われる変換を示したものです。
注意
これらのテーブルには、テキスト データ型は含まれません。 数値がテキスト形式で表されていると、場合によっては、Power BI は数値の種類を特定し、数値としてデータを表現しようとします。
加算 (+)
整数 | CURRENCY | 実数 | 日付/時刻 | |
---|---|---|---|---|
INTEGER | 整数 | CURRENCY | 実数 | 日付/時刻 |
CURRENCY | CURRENCY | 通貨 | 実数 | 日付/時刻 |
REAL | real | 実数 | 実数 | 日付/時刻 |
日付/時刻 | 日付/時刻 | 日付/時刻 | 日付/時刻 | 日付/時刻 |
たとえば、加算演算で実数と通貨データの組み合わせが使われている場合、DAX は両方の値を実数に変換し、結果を実数で返します。
減算 (-)
次の表で、行見出しは被減数 (左側) で、列見出しは減数 (右側) です。
整数 | CURRENCY | 実数 | 日付/時刻 | |
---|---|---|---|---|
INTEGER | 整数 | CURRENCY | 実数 | 実数 |
CURRENCY | CURRENCY | 通貨 | 実数 | 実数 |
REAL | real | 実数 | 実数 | 実数 |
日付/時刻 | 日付/時刻 | 日付/時刻 | 日付/時刻 | 日付/時刻 |
たとえば、減算演算で日付と他のデータ型が使われている場合、DAX は両方の値を日付に変換し、戻り値も日付になります。
注意
データ モデルでは単項演算子 - (負号) がサポートされていますが、この演算子はオペランドのデータ型を変更しません。
乗算 (*)
整数 | CURRENCY | 実数 | 日付/時刻 | |
---|---|---|---|---|
INTEGER | 整数 | CURRENCY | 実数 | 整数 |
CURRENCY | 通貨 | 実数 | CURRENCY | 通貨 |
REAL | 実数 | CURRENCY | 実数 | 実数 |
たとえば、乗算演算で整数を実数と組み合わせると、DAX は両方の数値を実数に変換し、戻り値も実数です。
除算 (/)
次の表では、行見出しが分子、列見出しが分母です。
整数 | CURRENCY | 実数 | 日付/時刻 | |
---|---|---|---|---|
INTEGER | 実数 | CURRENCY | 実数 | 実数 |
CURRENCY | 通貨 | 実数 | CURRENCY | 実数 |
REAL | real | 実数 | 実数 | 実数 |
日付/時刻 | real | 実数 | 実数 | 実数 |
たとえば、除算演算で整数と通貨値を組み合わせると、DAX は両方の値を実数に変換し、結果も実数になります。
比較演算子
DAX の比較式では、ブール値は文字列値より大きく、文字列値は数値または日付/時刻値より大きいと見なされます。 数値と日付/時刻値は同じランクです。
DAX では、ブール値または文字列値の暗黙的な変換は行われません。 BLANK または空白値は、比較対象の値のデータ型に応じて、0、""、または False に変換されます。
次の DAX 式に、この動作の例を示します。
=IF(FALSE()>"true","Expression is true", "Expression is false")
は "Expression is true" を返します。=IF("12">12,"Expression is true", "Expression is false")
は "Expression is true" を返します。=IF("12"=12,"Expression is true", "Expression is false")
は "Expression is false" を返します。
DAX では、次の表に示すように、数値型または日付/時刻型の暗黙的な変換が行われます。
比較 演算子 |
整数 | CURRENCY | 実数 | 日付/時刻 |
---|---|---|---|---|
INTEGER | 整数 | CURRENCY | 実数 | 実数 |
CURRENCY | CURRENCY | 通貨 | 実数 | 実数 |
REAL | real | 実数 | 実数 | 実数 |
日付/時刻 | real | 実数 | 実数 | 日付/時刻 |
空白、空の文字列、ゼロ値
DAX では、null、空白値、空のセル、または欠落値は、同じ新しい値型である BLANK で表されます。 BLANK 関数を使用すると、空白を生成することもできます。空白かどうかをテストするには、ISBLANK 関数を使用します。
加算や連結などの演算での空白の処理方法は、個々の関数によって異なります。 次の表は、DAX と Microsoft Excel の数式での空白の処理方法の違いをまとめたものです。
式 | DAX | Excel |
---|---|---|
BLANK + BLANK | BLANK | 0 (ゼロ) |
BLANK + 5 | 5 | 5 |
BLANK * 5 | BLANK | 0 (ゼロ) |
5/BLANK | 無限大 | Error |
0/BLANK | NaN | Error |
BLANK/BLANK | BLANK | Error |
FALSE OR BLANK | FALSE | FALSE |
FALSE AND BLANK | FALSE | FALSE |
TRUE OR BLANK | TRUE | TRUE |
TRUE AND BLANK | FALSE | TRUE |
BLANK OR BLANK | BLANK | Error |
BLANK AND BLANK | BLANK | Error |
次の手順
Power BI Desktop とデータを使用して、あらゆる種類の操作を実行できます。 Power BI の機能について詳しくは、次のリソースをご覧ください。