Power Query workout - Table.FromColumns

よく使う関数はハックしてさらに便利に使う。それだけだ。

https://docs.microsoft.com/en-us/powerquery-m/table-fromcolumns

```text:Power&#x20;Query
Table.FromColumns(lists as list, optional columns as any) as table
```

# 不足分は *null* に

*lists* パラメータには、リスト(*list*)のリスト(*list*) を引数にすることでテーブル(*table*)を得る。内側のリスト(*list*)はテーブルの列として変換され、リストアイテム数は一致しなくてもよいのが特徴。不足する列の値は *null* に
```text:Power&#x20;Query
// true
Table.FromColumns(
    {
        {1 .. 3},
        {"A", "B"}
    }
) =
#table(
    null,
    {
        {1, "A"}, 
        {2, "B"}, 
        {3, null} 
    }
)
```
# タイプ
*columns* パラメータの引数は、出力されるテーブルのタイプを表現するものを指定
```text:Power&#x20;Query
Type.RecordFields(
    Type.TableRow(
        Value.Type(
            Table.FromColumns(
                {
                    {}, {}, {}
                },
                3    // 👈
            )
        )
    )
)
---
[
    Column1 = [Type = type any, Optional = false],
    Column2 = [Type = type any, Optional = false],
    Column3 = [Type = type any, Optional = false]
]
```
```text:Power&#x20;Query
Type.RecordFields(
    Type.TableRow(
        Value.Type(
            Table.FromColumns(
                {
                    {}, {}, {}
                },
                {"A" .. "C"}    // 👈
            )
        )
    )
)
---
[
    A = [Type = type any, Optional = false],
    B = [Type = type any, Optional = false],
    C = [Type = type any, Optional = false]
]
```
```text:Power&#x20;Query
Type.RecordFields(
    Type.TableRow(
        Value.Type(
            Table.FromColumns(
                {
                    {}, {}, {}
                },
                type table [列1, 列2, 列3]    // 👈
            )
        )
    )
)
---
[
    列1 = [Type = type any, Optional = false],
    列2 = [Type = type any, Optional = false],
    列3 = [Type = type any, Optional = false]
]
```
```text:Power&#x20;Query
Type.RecordFields(
    Type.TableRow(
        Value.Type(
            Table.FromColumns(
                {
                    {}, {}, {}
                },
                type table [C1 = any, C2 = text, C3 = number]    // 👈
            )
        )
    )
)
---
[
    C1 = [Type = type any, Optional = false],
    C2 = [Type = type text, Optional = false],
    C3 = [Type = type number, Optional = false]
]
```

## ソースのタイプから
```:Power&#x20;Query
Type.RecordFields(
    Type.TableRow(
        Value.Type(
            Table.FromColumns(
                {
                    Value.ReplaceType({}, type list),
                    Value.ReplaceType({}, type {number}),
                    Value.ReplaceType({}, type {record}),
                    Value.ReplaceType({}, type {table})
                }
            )
        )
    )
)
---
[
    Column1 = [Type = type any, Optional = false],
    Column2 = [Type = type nullable number, Optional = false],
    Column3 = [Type = type nullable record, Optional = false],
    Column4 = [Type = type nullable table, Optional = false]
]
```
```text
Type.RecordFields(
    Type.TableRow(
        Value.Type(
            Table.FromColumns(
                Table.ToColumns(
                    #table(
                        type table [列1 = any, 列2 = number, 列3 = text],
                        {}
                    )
                )
            )
        )
    )
)
---
[
    Column1 = [Type = type any, Optional = false],
    Column2 = [Type = type nullable number, Optional = false],
    Column3 = [Type = type nullable text, Optional = false]
]
```

# 思ったこと🙄
出力されるテーブルの列は type any だと思ってたんだけど、そうでもなかったっていうね。
# その他
https://powerbi.connpass.com/

- [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)