日付テーブルを作成する

完了

Power BI でのレポートの作成時には、一般的なビジネス要件として、日付と時刻に基づいて計算を行います。 組織では、数か月、四半期、会計年度などの業績の把握が求められます。 そのため、このような時系列での値を適切な形式で設定することが非常に重要です。 Power BI では、日付列とテーブルに対して自動検出を行いますが、状況によっては、組織で必要とされる形式で日付を取得するために追加の手順が必要となる場合があります。

たとえば、あなたは組織の営業チームに関するレポートを作成しているとします。 データベースには、売上、注文、製品などのテーブルが含まれています。 Sales や Orders などのこれらのテーブルの多くには、Sales テーブルと Orders テーブルの ShipDate 列と OrderDate 列が示すように、独自の日付列が含まれていることに気付くでしょう。 あなたは、年別および月別の売上と注文の合計のテーブルを作成するタスクに取り組むことになりました。 それぞれが独自の日付列を参照する複数のテーブルが含まれるビジュアルをビルドするには、どうすればよいでしょうか?

Sales.ShipDate と Order.OrderDate が強調表示されているセマンティック モデルの抜粋のスクリーンショット。

この問題を解決するには、複数のテーブルで使用できる共通の日付テーブルを作成します。 次のセクションでは、Power BI でこのタスクを実行する方法について説明します。

共通の日付テーブルを作成する

共通の日付テーブルを作成するには、次の方法があります。

  • ソース データ

  • DAX

  • Power Query

ソース データ

場合によっては、ソース データベースとデータ ウェアハウスに独自の日付テーブルが既に含まれています。 データベースをデザインした管理者が綿密な仕事を行っていた場合は、これらのテーブルを使用して次のタスクを実行できます。

  • 会社の休日の識別

  • カレンダーと会計年度の区別

  • 週末と平日との識別

ソース データ テーブルは完成度が高く、すぐに使用できる状態になっています。 そのようなテーブルがある場合は、セマンティック モデルに取り込み、このセクションで説明されている他の方法は使用しないでください。 Power BI に加えて使用するかもしれない他のツールで共有される可能性があるため、ソースの日付テーブルを使用することをお勧めします。

ソース データ テーブルがない場合は、他の方法を使用して共通の日付テーブルを作成することができます。

DAX

Data Analysis Expression (DAX) 関数の CALENDARAUTO() または CALENDAR() を使用して、共通の日付テーブルを作成できます。 CALENDAR() 関数は、この関数の引数として入力される開始日と終了日に基づいて、連続した日付の範囲を返します。 別の方法として、CALENDARAUTO() 関数が、セマンティック モデルから自動的に決定される連続した完全な日付の範囲を返します。 開始日には、セマンティック モデルに存在する最も古い日付が選択されます。終了日は、セマンティック モデル、および CALENDARAUTO() 関数の引数として含めることを選択できる会計月に設定されたデータに存在する最も新しい日付です。 この例では、2011 年 5 月 31 日 (Sales でこのデータの追跡を開始した最初の日) 以降 10 年間のデータのみを表示するので、CALENDAR() 関数を使用します。

Power BI Desktop で [新しいテーブル] を選択し、次の DAX 式を入力します。

Dates  = CALENDAR(DATE(2011, 5, 31), DATE(2022, 12, 31))

Power BI の CALENDAR 式のスクリーンショット。

これで、使用できる日付の列が作成されました。 ただし、この列は少々まばらです。 また、年、月の番号、年間の週、曜日の列も表示する必要があります。 このタスクを実行するには、リボンで [新しい列] を選択して、次の DAX 式を入力します。これにより、Date テーブルから年が取得できます。

Year = YEAR(Dates[Date])

DAX 式を使用して列を追加しているスクリーンショット。

同じプロセスを実行して、月の番号、週の番号、曜日を取得できます。

MonthNum = MONTH(Dates[Date])
WeekNum = WEEKNUM(Dates[Date])
DayoftheWeek = FORMAT(Dates[Date], "DDDD")

完了すると、テーブルには、次の図に示す列が含まれます。

DAX テーブルの最終列のスクリーンショット。

これで、DAX を使用して、共通の日付テーブルが作成されました。 このプロセスは、新しいテーブルをセマンティック モデルに追加するのみです。日付テーブルと、Sales や Order テーブルとの間にリレーションシップを確立して、テーブルがセマンティック モデルの正式な日付テーブルであるというマークを付けるという作業がまだ必要です。 ただし、これらのタスクを完了する前に、Power Query を使用して、共通の日付テーブルを作成する他の方法についても必ず検討してください。

Power Query

Power Query でクエリを作成するために使用する開発言語である M 言語を使用すると、共通の日付テーブルを定義できます。

Power BI Desktop で [データの変換] を選択すると、Power Query に移動します。 左側の [クエリ] ペインの空白部分で右クリックして、次のドロップダウン メニューを開きます。このドロップダウンメニューでは、[新しいクエリ] > [空のクエリ] の順に選択します。

Power BI での新しいクエリ作成のスクリーンショット。

生成された [新しいクエリ] ビューで、次の M 式を入力して、カレンダー テーブルを作成します。

= List.Dates(#date(2011,05,31), 365*10, #duration(1,0,0,0))

M 式を使用したカレンダー テーブル作成のスクリーンショット。

売上データでは、データに含まれている最も古い日付 (2011 年 5 月 31 日) を開始日に反映させます。 さらに、今後 10 年間の日付 (将来の日付を含む) を表示する必要があります。 この方法では、新しい売上データが含まれている場合に、このテーブルを再作成する必要が確実になくなります。 また、期間を変更することもできます。 この場合、データ ポイントが毎日必要になりますが、時間、分、秒で増分することもできます。 結果を次の図に示します。

一覧としての販売カレンダーのスクリーンショット。

プロセスが成功したことを確認したら、日付のテーブルではなく、日付のリストがあることに気付くでしょう。 このエラーを修正するには、リボンの [変換] タブに移動して、[変換] > [テーブルへの変換] の順に選択します。 名前が示すように、この機能では、リストがテーブルに変換されます。 列の名前を DateCol に変更することもできます。

Power Query エディターでのリストのテーブルへの変換のスクリーンショット。

次に、新しいテーブルに列を追加して、年、月、週、日で日付を表示します。これにより、ビジュアルで階層をビルドできます。 最初のタスクでは、列の名前の横にあるアイコンを選択して列の型を変更し、生成されたドロップダウン メニューで Date 型を選択します。

型を date に変更したスクリーンショット。

Date 型の選択が完了したら、年、月、週、日の列を追加できます。 次の図に示すように、[列の追加] に移動し、[Date] の下にあるドロップダウン メニューを選択して、[Year] を選択します。

Power Query を使用した列の追加のスクリーンショット。

DateCol から取得されたすべての年の列が、Power BI によって追加されていることにご注意ください。

テーブルで Power Query を使用した列の追加のスクリーンショット。

月、週、日について、同じプロセスを完了します。 このプロセスを完了すると、テーブルには、次の図に示す列が含まれます。

DateCol、Year、Month、Week of Year、Day Name の各列のスクリーンショット。

これで、Power Query を使用して、共通の日付テーブルを作成することができました。

前の手順では、テーブルをセマンティック モデルに取り込む方法について説明しました。 次に、テーブルを正式な日付テーブルとしてマークして、Power BI により将来のすべての値が認識され、確実に形式を正しいことが確保されるようにする必要があります。

正式な日付テーブルとしてマークする

テーブルを正式な日付テーブルとしてマークする場合の最初のタスクは、[フィールド] ペインで新しいテーブルを見つけることです。 次の図に示すように、テーブルの名前を右クリックして、[日付テーブルとしてマーク] を選択します。

[日付テーブルとしてマーク] オプションのスクリーンショット。

テーブルを日付テーブルとしてマークすると、Power BI によって検証が実行され、データが null 値を含んでおらず、一意であり、ある期間にわたって連続する日付の値を含んでいることが確保されます。 テーブル内の特定の列を日付としてマークすることもできます。これは、テーブル内に多くの列がある場合に便利です。 テーブルを右クリックして、[日付テーブルとしてマーク] を選択し、[日付テーブルの設定] を選択します。次のウィンドウが表示されます。ここでは、Date としてマークする列を選択できます。

[日付テーブルとしてマーク] ダイアログのスクリーンショット。

[日付テーブルとしてマーク] を選択すると、日付テーブルとしてマークしたテーブルの [Date] フィールドから自動生成された階層が削除されます。 その他の [Date] フィールドについては、そのフィールドと日付テーブルの間にリレーションシップを確立するまで、または [自動の日付/時刻] 機能をオフにするまで、自動階層が引き続き存在します。 共通の日付テーブルに階層を手動で追加するには、[フィールド] ペインで、年、月、週、または日の列を右クリックして、[新しい階層] を選択します。このプロセスについては、このモジュールの後半で説明します。

ビジュアルをビルドする

Sales テーブルと Orders テーブルの間でビジュアルをビルドするには、この新しい共通の日付テーブルと、Sales テーブルや Orders テーブルの間にリレーションシップを確立する必要があります。 その結果、新しい日付テーブルを使用して、ビジュアルをビルドできるようになります。 このタスクを完了するには、[モデル] タブ、>[リレーションシップの管理] の順に移動します。ここでは、OrderDate 列を使用して、共通の日付テーブルと、Orders テーブルや Sales テーブルの間にリレーションシップを作成できます。 次のスクリーンショットでは、そのようなリレーションシップの例を示します。

[リレーションシップの作成] ダイアログのスクリーンショット。

リレーションシップをビルドした後は、DAX または Power Query メソッドを使用して開発した共通の日付テーブルを使用して、時間別の合計売上と注文数のビジュアルを作成できます。

売上の合計を決定するには、Sales テーブルの Amount 列が売上収入の合計ではなく、各売上の収入のみを表示するため、すべての売上を追加する必要があります。 このタスクを完了するには、次のメジャー計算を使用します。これについては、後で説明します。 このメジャーをビルドする場合に使用する計算は、次のとおりです。

#Total Sales = SUM(Sales[‘Amount’])

完了したら、[視覚化] タブに戻り、[テーブル] を選択して、テーブルを作成できます。 注文と売上の合計を年別および月別に表示するので、日付テーブルの年と月の列、OrderQty 列、#TotalSales メジャーのみを含めます。 階層について学習する場合には、年から月にドリルダウンできる階層をビルドすることもできます。 この例では、それらを横に並べて表示できます。 これで、共通の日付テーブルを使用して、ビジュアルを作成することができました。

DAX を使用した共通の Date 列のスクリーンショット。