数ヶ月で折り返す表を作ってみた

報告用に数ヶ月で折り返す形の表が必要な場合があります。
本来はPower Queryで、そういうデータから、整然としたテーブルデータに持っていくんですけど、今回は逆に、整然としたテーブルを、数ヶ月区切りの表に変換してみました。


##サンプルデータ（予算と実績の2つのテーブル）
詳細エディタに貼り付ければ、テーブルになります。

```PQ:t_予算
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("TVJJEsMgDPtLzj3gHd7Syf+/0Uhkig8wMcJaTL7fK8b1ueRZYdhdC/Xw6/68oAKMBTDnsy85mAFXnMpiPQ/mz6rEV4aTNA8YIJo4nkUH0hQT3YIrZuCuOhjspdNw7PaD8S5jxGQMb6QIMB1hiruMcUAhNcVShX4ar3AygbA+YMtbTFFOxpmeLl5ReQfLEbBaB6CPST22irYuCM1EglJKeB2QQgtpLOilNaJWXNBN8weSvvgiGkzUvFBoKLMzgB6MD754i5qyGkgTE26Nv01kS07je0LGhB0kofEtbUs0EE7IWraJ7vsH", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [期 = _t, 月 = _t, 売上 = _t, 原価 = _t, 利益 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"期", Int64.Type}, {"月", Int64.Type}, {"売上", Int64.Type}, {"原価", Int64.Type}, {"利益", Int64.Type}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"月", "期"}, "項目", "予算")
in
    #"Unpivoted Other Columns"
```
↓貼るとこんな感じ
![予算.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/f0fa9678-d16e-71f9-ecc7-d973ebaa8861.jpeg)


```PQ:t_実績
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("VZFBrsQwCEPv0vUsSoBAzjLq/a/xY6ca+IsgtY9g7Hy/l9/X55J9fKJa4HvJ9XxeNvaZN6rlQq9oQUWDAQ5B1buY7ROBOnXiomZBh8rKXXNwg2gQ3aaYrY6abWqAT3S4BddZBZOSTsmkZBTE8kmTwSp3GyucTSdTB+d2ymgmN1qo0WFlY4qVfBwob7JUO0YK4FIaVdW5gBdkbzohfVgURKI2IKTGRivmfA8+B8f8wKT5SZP/YpM307DJhzbKNQfUv0nTuHnflK4ZntJGNMbf4vG+/a5Nk5Eed85IxfrVEw9bTvPz/AE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [期 = _t, 月 = _t, 売上 = _t, 原価 = _t, 利益 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"期", Int64.Type}, {"月", Int64.Type}, {"売上", Int64.Type}, {"原価", Int64.Type}, {"利益", Int64.Type}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"期", "月"}, "属性", "実績")
in
    #"Unpivoted Other Columns"
```
↓貼るとこんな感じ
![実績.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/cfba15fa-6f84-62ed-1c5d-f6f6ecd49669.jpeg)


##報告表に変換するクエリ
今回は4ヶ月で折り返す前提で、作りました。List.Split()のところの引数でいじれます。

###コード

```PQ:完成品
let
    Source = Table.NestedJoin(t_実績, {"期", "月", "属性"}, t_予算, {"期", "月", "項目"}, "t_予算", JoinKind.LeftOuter),
    #"Expanded {0}" = Table.ExpandTableColumn(Source, "t_予算", {"予算"}, {"予算"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Expanded {0}",{"期", "月", "属性", "予算", "実績"}),
    #"Added Custom" = Table.AddColumn(#"Reordered Columns", "差異", each [実績]-[予算]),
    //期・月と科目でピボット解除
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Added Custom", {"期", "月", "属性"}, "属性.1", "値"),
    #"Pivoted Column1" = Table.Pivot(#"Unpivoted Columns", List.Distinct(#"Unpivoted Columns"[属性]), "属性", "値"),
    //期・月でグループ化。集計せず「全ての行」
    #"Grouped Rows" = Table.Group(#"Pivoted Column1", {"期", "月"}, {
                                            {"全分類", each _, 
                                            type table [期=number, 月=number, 属性.1=text, 売上=number, 原価=number, 利益=number]
                                            }}
                      ),
    //★★★ここからコード入力が必要。★★★
    //テーブルを行列入れ替えて、各列を要素とするリストにする。（順番は守られる）
    Custom1 = Table.TransformColumns(#"Grouped Rows",{"全分類",each Table.ToColumns(Table.Transpose(Table.DemoteHeaders(_)))}),
    //画像の例にならい、4ヶ月ごとにしたいので、4つずつで一つのリストにする。
    Custom2 = List.Split(Custom1[全分類],4),

    Custom3 = Table.FromColumns(Custom2),    　　　　　 //列からテーブルにする。この時点では行・列が逆
    #"Transposed Table" = Table.Transpose(Custom3),    //行･列を変換して、ブロックが完成する。

    //このままでは展開できないので、各ブロック（＝行）ごとに1個のリストにした上で、テーブルにする。Skipをいれるのは行見出しの重複をさけるため。
    #"Added Custom1" = Table.AddColumn(#"Transposed Table", "カスタム", each 
                                        List.Combine({[Column1],List.Skip([Column2]),List.Skip([Column3]),List.Skip([Column4])})),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom1",{"カスタム"}),
    Custom4 = Table.TransformColumns(#"Removed Other Columns",{"カスタム",each Table.FromColumns(_)}),

    //各テーブルに挿入するnull行の生成と挿入。行見出しと中身で計13列。
    空白行 = Record.FromList( List.Repeat({null},13),
                             List.Accumulate({1..13},{},(x,y)=>x&{"Column"&Number.ToText(y)})
            ),
    Custom5 = List.Transform(Custom4[カスタム],each Table.InsertRows(_,0,{空白行})),
    //各ブロックを1個のテーブルにする。
    Custom6 = Table.Combine(Custom5)
in
    Custom6
```

###完成図

![完成品.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/1aa3f84a-93b6-81e3-3c01-0344bea44281.jpeg)