Power BI での大文字・小文字の照合の注意

# はじめに
　Power BIのデータモデルでは、CS(Case Sensitivity)にしたくてもできません。<B>大文字・小文字を区別しない</B>のです。一方、<B>Power Queryでは大文字・小文字を区別</B>します。
　こういった特性をふまえて、大文字・小文字を区別したい、区別せずにPower Queryで整理したいなどやりたい場合があるかと考えます。これらのCS話について、発生する注意点やリファレンス、関連ブログ等を交えて整理します。

## Power BIのモデルではCSしない

関連のドキュメントはこちらです。

https://learn.microsoft.com/ja-jp/power-bi/fundamentals/supported-languages-countries-regions?WT.mc_id=DP-MVP-5004418#choose-the-language-for-the-model-in-power-bi-desktop

> ⚠️注意
Power BI モデルでは、現在、<B>大文字と小文字を区別しない</B> (またはひらがなとカタカナを区別しない) ロケールが使用されているため、"ABC" と "abc" は同等に扱われます。 "ABC" が最初にデータベースに読み込まれた場合、"Abc" のように大文字と小文字だけが異なる他の文字列は、別の値として読み込まれません。

「"ABC" と "abc" は同等に扱われます」「ABC" が最初にデータベースに読み込まれた場合、... 別の値として読み込まれません。」あたりが少しわかりにくいでしょうか。
 要は<B>最初に読み込まれた文字列の大文字・小文字に、2つめ以降の文字列は揃えられる</B>という動きになります。

## Power QueryではCSする

関連のドキュメントはこちらです。

https://learn.microsoft.com/ja-jp/power-query/working-with-duplicates?WT.mc_id=DP-MVP-5004418

> ⚠️注意
<B>Power Query では大文字と小文字が区別されます</B>。 重複する値を処理するときに、Power Query では、テキストの大文字と小文字が考慮されるため、望ましくない結果になる可能性があります。 回避策として、ユーザーは重複を削除する前に大文字または小文字の変換を適用できます。

## 例題でみていきましょう データモデルから

元データは下記のようなシンプルな2行のデータとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/dd349841-fb75-a28c-5487-6f63783817b9.png)

Power BIに読み込むプレビューの段階では元データのままですが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/68744503-aa98-c56d-a7f1-9a110bc1e54c.png)

データビューでみると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/28a75d55-54ca-54d5-eb37-0a622d172801.png)

ID1のGuy in a Cubeに、ID2も揃えられる、ということです。
ステータスバーを見ると「<B>1個の</B>別個の値」となっています。
最初に読み込んだ表記に合わせられた1個の値になった、ということです。
念のための確認で、新しいテーブルで、Name列でDistinctしても一意になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/aa64470a-ce7d-4989-b273-2571959b1af5.png)

Japan CSS Support Power BI Blogの記事でも例示が参考になります。

https://jpbap-sqlbi.github.io/blog/powerbi/pbi_model_character_tips/

## 例題をPower Queryで「重複の削除」しても名寄せできない

　例題では2行のごく簡単な例ですが、大文字・小文字が混じっているカラムがより多く混じっている場合で、ディメンションテーブルを意図する文字列にしたい、という場合はどうすればよいでしょうか。
　まずは、単純に「重複の削除」してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/b1af5eab-1371-fd13-9c2f-955998063f2b.png)

 <B>Power Queryでは大文字・小文字を区別</B>しますので、重複の削除、Table.Distinctを実行しても結果は変わりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/03e9940b-1171-bc9f-bb04-d94adc4c5717.png)

## Power Queryの段階で名寄せするには

　今の例のCubeやcubeが混じっているのは表記揺れだ、ディメンションテーブルのような一意な項目を作りたい、大文字・小文字を区別したくない、という場合はどうすればよいでしょうか？
　一例を示します。まずは、大文字、小文字を同じルールで統一した列を作ります。

まずはName列の重複した列を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/d6262106-fdf4-602f-29b4-5ea5d7b682f4.png)

各単語の先頭文字を大文字にします（全部大文字、全部小文字でもOKですかね）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/2fa9e8d6-9311-eee5-b1cf-fdf3124e77c7.png)

結果は以下のように同じ文字にそろいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/ec9d1464-9166-a39e-8e0e-ac5fbf55a44b.png)

## Power Queryのグループ化を活用しよう
これで、Name-コピー列でグループ化することができ、その行の中で特定の列のルールを持って、絞ることにします。
まずは、Date列が最新である、ID1の表記に合わすことにしたとしましょう。

グループ化のドキュメントはこちらです。

https://learn.microsoft.com/ja-jp/power-query/group-by?WT.mc_id=DP-MVP-5004418#use-an-aggregate-function-to-group-by-one-or-more-columns

「1 つ以上の列でグループ化する操作を実行する」をまずは行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/ad1bf2ce-2679-95dc-446c-927db6b2f58b.png)

集計テーブル列のTableの空きスペースをクリックすると下部にグループ化された中身が見られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/77541691-7ef8-a7f3-8724-4d98d300afef.png)

次はドキュメントの「最も売れている製品の情報を抽出する」の要領で、カスタム列を追加し、最新の日付のデータを取り出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/0a278795-2b3e-0d8f-7153-01589b27048e.png)

実行後の選択済列の中身を見ると、ID1が選ばれたことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/0139358d-d0c3-91e8-a537-56a17edffc86.png)
列を展開して、不要な列を削除すると以下の結果を得ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/2b435dae-c4c2-6277-1b67-26bd010159d5.png)

もし、ID2のcubeが小文字を選択したく、そのルールをValueがMaxなもの、としたい場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c9ff5e93-a100-3687-1de8-632da579bb1c.png)

と変更することにより

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/0ee27c4a-a2b2-e7b9-2d44-7f24762706e0.png)

こちらの結果が得られます。Table.Maxのところは、Talbe.Min他その他のルールで置き換えなど適時応用可能かと考えます。

### （補足）Table.GroupでComparer.OrdinalIgnoreCase オプションの活用

@PowerBIxyz さんにコメントで教わりました）。上記のようにName列のコピーを作り、大文字・小文字をそろえなくても、Name列自体でグループ化するときに、大文字・小文字関係なくグループ化することが、Table.Groupの最後のオプションにあります。Comparer.OrdinalIgnoreCaseです。

```ruby:最終オプションを付加、その前のオプションはnullとする
Table.Group(削除された重複, {"Name"}, {{"集約行テーブル", each _, type table [ID=nullable number, Name=nullable text, Value=nullable number, Date=nullable date]}},null,Comparer.OrdinalIgnoreCase)
```

Name列でグループ化できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/38a81f65-c1ab-271e-54d8-2b42ab508128.png)

こちらのほうがステップがすっきりと減りますね。

https://learn.microsoft.com/ja-jp/powerquery-m/table-group?WT.mc_id=DP-MVP-5004418

@PowerBIxyz さん、ご指摘いただきありがとうございます（いつも感謝しております）。


## データモデルで大文字・小文字を区別したい例

ゼロ幅スペースを足す対応案が従前のブログで紹介されています。

@PowerBIxyz さんのブログでは、ゼロ幅スペースをID数分足して、ユニークにする方法が、

https://qiita.com/PowerBIxyz/items/f55b1f33c7d16e352493#%E3%82%BC%E3%83%AD%E5%B9%85%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9-%E8%B6%B3%E3%81%97%E3%81%A8%E3%81%8D%E3%82%83%E3%81%84%E3%81%84%E3%82%93%E3%81%98%E3%82%83%E3%81%AD

Japan CSS Support Power BI Blog では、小文字だったらゼロ幅スペースを足す方法が

https://jpbap-sqlbi.github.io/blog/powerbi/pbi_model_character_tips/#%E5%A4%A7%E6%96%87%E5%AD%97%E3%81%A8%E5%B0%8F%E6%96%87%E5%AD%97%E3%82%92%E5%8C%BA%E5%88%A5%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

あります。どうしても大文字・小文字を区別したいんだ、という時は参考にされるとよいでしょう。

# おわりに
 メモを残さないと、自分でもわからなくなりやすい、ということで書きました。製品知識を正しく理解することは大事ですね。