列の削除 をすべきか、他の列の削除 をすべきか、それが問題だ

タイトルは単に勢いです。でも、知っているとちょっと役立ちます。
Power BI Desktop や Excel などの クエリ エディター で集計に不要な列(column)除外していくことは重要なタスクです。クエリの列の削除操作として、

- 列の削除
- 他の列の削除

があります。似ている感じはしますけど、それぞれ適した使い方があるので試しながら整理。
![delete columns](https://qiita-image-store.s3.amazonaws.com/0/193509/6a073be4-8f0b-4830-a664-22ee93c8faa1.png)

# 操作と得られる結果
## 列の削除
- 不要な列を選択し削除する。

```text
Table.RemoveColumns(
    table as table,    // 対象のテーブル
    columns as any,    // 対象の列名(文字列) 複数の列が対象のときは list で
    optional missingField as nullable MissingField.Type
) as table
```
 [Table.RemoveColumns - Power Query M function reference][RemoveColumns]

## 他の列の削除
- 選択した列以外を削除する。
-  **列を選択(Table.SelectColumns)** していることがポイント。

```text
Table.SelectColumns(
    table as table,    // 対象のテーブル
    columns as any,    // 対象の列名(文字列) 複数の列が対象のときは list で
    optional missingField as nullable MissingField.Type
) as table 
```
[Table.SelectColumns - Power Query M function reference][SelectColumns]

## 例で確認
"Query1_a" というクエリ(type table)があって、

|col1|col2|col3|
|:--:|:--:|:--:|
|a|10|削除する列の1|
|b|15|削除する列の2|

```text:Query1_a
// Query1_a
let
    Source = #table(
        type table [col1 = text, col2 = number, col3 = text],
        {
            {"a", 10, "削除する列の1"}
           ,{"b", 15, "削除する列の2"}
        }
    )
in
    Source
```

クエリ "Query1_a" を参照するクエリを2種類作成。この時点ではそれぞれが参照しているにすぎないのでいずれも同じ結果になる

```text:列の削除
// 列の削除
let
    Source = Query1_a
in
    Source
```

```text:他の列の削除
//他の列の削除
let
    Source = Query1_a
in
    Source
```
### それぞれ適用してみる
列 "col1"と"col2" が残るようにステップを追加する。

```text:列の削除
// 列の削除
let
    Source = Query1_a,
    // 列 "col3" を選択して、[列の削除]
    #"Removed Columns" = Table.RemoveColumns(Source,{"col3"})
in
    #"Removed Columns"
```

```text:他の列の削除
// 他の列の削除
let
    Source = Query1_a,
    // 列 "col1" と "col2" を選択して、[他の列の削除]
    #"Removed Other Columns" = Table.SelectColumns(Source,{"col1", "col2"})
in
    #"Removed Other Columns"
```

|col1|col2|
|:--:|:--:|
|a|10|
|b|15|

この時点でも同じ結果を得られる。

### 列が追加されたとき
クエリ "Query1_a" にはない列も持つクエリ "Query1_b" を用意し、

|col1|col2|col3|col4|
|:--:|:--:|:--:|:--:|
|c|20|削除する列の3|追加される列の1|
|d|25|削除する列の4|追加される列の2|

```text:Query1_b
// Query1_b
let
    Source = #table(
    type table [col1 = text, col2 = number, col3 = text, col4 = text],
    {
        {"c", 20, "削除する列の3", "追加される列の1"}
       ,{"d", 25, "削除する列の4", "追加される列の2"}
    }
)
in
    Source
```
クエリ "Query1_a" に追加(Append) する。

```text:Query1_a
// Query1_a
let
    Source = #table(
        type table [col1 = text, col2 = number, col3 = text],
        {
            {"a", 10, "削除する列の1"}
           ,{"b", 15, "削除する列の2"}
        }
    ),
    #"Appended Query" = Table.Combine({Source, Query1_b})
in
    #"Appended Query"
```

|col1|col2|col3|col4|
|:--:|:--:|:--:|:--:|
|a|10|削除する列の1|null|
|b|15|削除する列の2|null|
|c|20|削除する列の3|追加される列の1|
|d|25|削除する列の4|追加される列の2|

Table.Combine により、行が追加されると同時に 列 "col4" が追加された状態になる。

### その結果どうなるか
参照しているクエリの行および列が追加されているので、それぞれのクエリの結果も反映されていることを確認。
#### 列の削除
- 行は追加される。
- 参照元で追加された列も追加される。(削除対象になっていないということ)

|col1|col2|col4|
|:--:|:--:|:--:|
|a|10|null|
|b|15|null|
|c|20|追加される列の1|
|d|25|追加される列の2|
#### 他の列の削除
- 行は追加される。
- 参照元で追加された列は追加されない。

|col1|col2|
|:--:|:--:|
|a|10|
|b|15|
|c|20|
|d|25|


## 該当列が存在しないとき(MissingField)
では、引数 columns で指定した列名が存在しなかったときどうするかには、 引数 missingField を指定し対応すればよい。

|MissingField.Type|値|RemoveColumns|SelectColumns|
|:--|:--:|:--|:--|
|MissingField.Error(既定値)|0|Expression.Error|Expression.Error|
|MissingField.Ignore|1|無視される|無視される|
|MissingField.UseNull|2|-|列が追加される|

### MissingField.Error(既定値)
- 引数 missingField の既定値。
- 対象となる列がひとつでも存在しないとき、クエリは Expression.Error になり 結果(type table)を返さない。

### MissingField.Ignore
- 存在しない列を無視した結果(type table)が得られる。

### MissingField.UseNull
[他の列の削除] を使用しているとき、存在しない列 "colX" と MissingField.UseNull を指定すると、値 null の列として 列 "colX" が追加された結果(type table) が得られる 

```text:他の列の削除
let
    Source = Query1_a,
    // 存在しない列 colX と MissingField.UseNull を指定
    #"Removed Other Columns" = Table.SelectColumns(Source,{"col1", "col2", "colX"}, MissingField.UseNull)
in
    #"Removed Other Columns"
```

|col1|col2|colX|
|:--:|:--:|:--:|
|a|10|null|
|b|15|null|
|c|20|null|
|d|25|null|


# 情報
[Query and Data Modeling Languages | MSDN](https://msdn.microsoft.com/en-us/library/mt244090.aspx)

# その他
- [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)

[Reference]:https://msdn.microsoft.com/library/mt211003.aspx
[RemoveColumns]:https://msdn.microsoft.com/en-us/library/mt260776.aspx
[SelectColumns]:https://msdn.microsoft.com/en-us/library/mt260828.aspx
[Combine]:https://msdn.microsoft.com/en-us/library/mt260748.aspx