Power BI データモデルにも 照合順序 はあるのです。セッティングできないですけどね。 #PBIJP

CS(Case Sensitivity) にしたいと思ってもできないのです。なぜならサービスで提供されている環境だし、バラバラのセッティングすべてへのサポートは合理的ではないから、SQL Server Analysis Services (SSAS) や Azure Analysis Services (AAS) のようにカスタマイズできないのある。言語ごとに既定の照合順序が設定されているのでそのまま使う。で、どうするかって話。

# 設定は？
Power BI Desktop の [オプション] - [グローバル] - [地域の設定] - [モデルの言語] で選択。言語を選択するだけだから個別に変更できないのだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/03772524-1eb1-96ad-9d5a-c1fc7141b962.png)

# CI / AS / KS / WS
どうなっているかを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/8529513b-d867-9972-face-20088197b7b3.png)
インポートするとこうなる。CI / KS / WS でしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/24c7d0dd-457a-ba38-5183-f54a1bb86a3d.png)

- CI : 大文字小文字は区別しない
- KS : かなカナは区別する
- WS : 全角半角は区別する
- サンプルを用意するの忘れたけどたぶん AS

## CS にできないので
照合順序の指定ができないのだけど、CS のようにしたいときどうするか。
### 行の識別子を追加してもダメですよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/38015559-033f-fbab-efde-7aaafb7b1d4a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/d47756e2-557e-4ecf-16ff-911316c062aa.png)
列ごとにエンコードされるだけだし、行の識別子があろうがなかろうが関係ないのです。

### ゼロ幅スペース 足しときゃいいんじゃね？
列に含まれる値(文字列)は ハッシュタイプ のエンコード。照合順序で同一とみなしくない値は表示に影響がない程度に変更しディクショナリーに登録されるようにすればよいかなと。フィルタ条件がちょい手間になるけど、ディメンジョン テーブルであれば行の識別子で。

```text:PowerQuery
let
    Source = #table(
        type table [ id = Int64.Type, 全部あっぷる = text ],
        {
            { 1, "APPLE" },
            { 2, "apple" },
            { 3, "ＡＰＰＬＥ" },
            { 4, "ａｐｐｌｅ" },
            { 5, "アップル" },
            { 6, "ｱｯﾌﾟﾙ" },
            { 7, "あっぷる" }
        }
    ),
    #"Added Custom" = Table.AddColumn(
        Source, "全部あっぷる改",
        each
            [全部あっぷる]
            & Text.Repeat( Character.FromNumber( 8203 ), [id] ),
            type text
    )
in
    #"Added Custom"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/693c51e9-c128-45ad-efce-834d2b1ea4fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/e2293336-5474-1760-6579-46eebafebbb7.png)

# CI なんだけど比較式は
なんとか大文字小文字は区別してインポートできたとしても、メジャーなどDAX 式については引き続き照合順序に基づき評価される。
EXACT 関数 (DAX) や CONTAINSSTRINGEXACT 関数 (DAX) という、大文字小文字区別して評価する関数が用意されているので必要に応じて使えばよい。

```text:こんな感じで評価される
// true
"APPLE" = "apple"

// true 
"APPLE" == "apple"

// false
EXACT( "APPLE", "apple" )

// true
CONTAINSSTRING( "PINEAPPLE", "apple" )

// false
CONTAINSSTRINGEXACT( "PINEAPPLE", "apple" ) 
```

# emoji はどうするか
ちょっと面倒だなと思うことは起きる。照合順序の挙動により置き換わってしまう絵文字とかあるんだよね。[UnicodeのEmojiの一覧 - Wikipedia](https://ja.wikipedia.org/wiki/Unicode%E3%81%AEEmoji%E3%81%AE%E4%B8%80%E8%A6%A7)にあるうちで確認するとだいたい150程が影響を受けるんですよ。ただし、[モデルの言語]が英語であるとき影響はなくて、私たちが一番多く使うであろう[モデルの言語]が日本語であるとき。たぶん 英語以外はすべてで影響がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/2c601750-11b2-aca7-3a36-b01e8e091ffd.png)
なぜ置き換わる動作が発生するかについては、インポートモードのエンコードの仕組みについて知っておくとよい

## ゼロ幅スペースを追加して区別させるとよいかもしれない。
データがインポートされるとき照合順序で区別されるようにすればよいのだから、大文字小文字の区別同様ゼロ幅スペースを追加して区別させるとよいかもしれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/1d9edab8-1abf-6a00-b3b8-3ed2754f99df.png)

```text
Table1 = 
{
    ( "⭕", "⭕" ),
    ( "❌" ,"❌" & UNICHAR( 8203 ) ),
    ( "⚾うぇーぃ", "⚾うぇーぃ" & REPT( UNICHAR( 8203 ), 0 ) ),
    ( "う⚽ぇーぃ", "う⚽ぇーぃ" & REPT( UNICHAR( 8203 ), 1 ) ),
    ( "うぇ⛵ーぃ", "うぇ⛵ーぃ" & REPT( UNICHAR( 8203 ), 2 ) ),
    ( "うぇー⛳ぃ", "うぇー⛳ぃ" & REPT( UNICHAR( 8203 ), 3 ) ),
    ( "うぇーぃ❔", "うぇーぃ❔" & REPT( UNICHAR( 8203 ), 4 ) )
}
```

## いっそのことモデルの言語を英語に
もっとも手間がかからなそうなのがモデルの言語を英語にしてしまうこと。ただ、モデルの言語が日本語であるときの特有の動作と照合順序が異なる可能性から期待する評価にならないことはあるかもしれない。そのことで困ったことはないし、FORMAT 関数(DAX)の日付書式文字列の一部(元号 ggge や 曜日 aaaa)が使えなくても何とかなるでしょ。

## モデルの言語に限らずDAX式の評価 -emoji-

```text:この組み合わせだけということではないですよ
// false
"⚽" = "🏀"
"⚽" == "🏀"
EXACT ( "⚽", "🏀" )
CONTAINSSTRINGEXACT( "⚽", "🏀" )

// true
"⚽" = "⚾"
"⚽" == "⚾"

// false
EXACT( "⚽", "⚾" )

// true
CONTAINSSTRINGEXACT( "⚽", "⚾" )
```


# 思ったこと🙄
いろいろ試して調べていて、モデルの言語(Culture)が日本語であるとき、照合順序(Collation)は Japanese_XJIS_100_CI_AS_KS_WS って感じかなと。
SSAS では _100 / _90 とか BIN2 で Collation の設定ができるから、Power BI データモデルでも技術的には可能なんだけど、インポートされるときやDAX式が評価されるときの照合順序が影響してしまうから、思ってもない結果を得る場合がある。Power BI で Collation を変更することはやってはいけないことではある。でも勉強にはなる。

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)