Power Query へそのゴマ　チャレンジ　解答

### 問題 1: データ型の最適化
次のクエリは、Power QueryでExcelファイルからデータを読み込んでいます。このクエリを最適化するには、どの手順が必要ですか？

```M
let
    Source = Excel.Workbook(File.Contents("C:\Data.xlsx")),
    Sheet = Source{[Item="SalesData", Kind="Sheet"]}[Data],
    #"Changed Type" = 
        Table.TransformColumnTypes(
            Sheet, 
            {
                {"Date", type text}, 
                {"Amount", type number}
            }
        )
in
    #"Changed Type"
```

A. 「Date」列のデータ型を `type date` に変更  
B. 「Amount」列のデータ型を `type text` に変更  
C. ファイルのサイズを小さくする  
D. クエリの手順を減らす

---

**解答**: A

**解説**:  
- データ型はクエリのパフォーマンスと分析に影響を与える重要な要素です。  
- 「Date」列を `type text` に設定していると、日付データとして扱えず、日付フィルタや計算が効率的に行えません。適切なデータ型 `type date` に設定することで、データ分析がスムーズになります。  
- 最適化後のコード例：
  ```M
  #"Changed Type" = 
      Table.TransformColumnTypes(
          Sheet, 
          {
              {"Date", type date}, 
              {"Amount", type number}
          }
      )
  ```

---

### 問題 2: 条件付き列の使用
次のクエリで「High」または「Low」を割り当てる新しい列を追加するには、どの操作を使用しますか？

```M
let
    Source = Table.FromRows({
        {"John", 500},
        {"Mary", 200},
        {"Paul", 300}
    }, {"Name", "Sales"})
in
    Source
```

A. フィルタリング  
B. 条件付き列の追加  
C. 列の結合  
D. 行の削除

---

**解答**: B

**解説**:  
- 条件付き列の追加は、列の値に基づいて動的に値を割り当てる場合に使用します。  
- この例では、「Sales」列の値が300以上の場合は「High」、それ以外は「Low」を新しい列に設定します。  
- 実装例：
  ```M
  Table.AddColumn(
      Source, 
      "Category", 
      each 
          if [Sales] >= 300 
              then "High" 
              else "Low"
  )
  ```

---

### 問題 3: データ結合の種類
次のシナリオで適切な結合の種類を選んでください。  
2つのテーブルがあります：
- テーブルA（すべての製品IDを含む）  
- テーブルB（販売データを含む）

すべての製品と対応する販売データを表示する必要がありますが、販売データがない製品もリストに含めたいです。どの結合の種類を使用すべきですか？

A. 内部結合  
B. 左外部結合  
C. 右外部結合  
D. フル外部結合

---

**解答**: B

**解説**:  
- 左外部結合は、左側のテーブル（テーブルA）のすべての行を保持し、右側のテーブル（テーブルB）の一致するデータを追加します。  
- 一致するデータがない場合、右側の列は `null` になります。  

---

### 問題 4: フォルダデータの結合
「C:\SalesReports」フォルダ内のすべてのCSVファイルを読み込み、1つのテーブルに結合します。これを達成するために最適なデータソースの選択肢はどれですか？

A. データベース  
B. フォルダ  
C. Webデータソース  
D. Excelファイル

---

**解答**: B

**解説**:  
- 「フォルダ」を選択することで、フォルダ内のすべてのファイルをPower Queryに読み込み、一括処理できます。  

---

### 問題 5: エラー処理
以下のコードは、データが存在しない場合にエラーが発生します。この問題を解決するために最適なアプローチは何ですか？

```M
let
    Source = Table.SelectRows(#"Previous Step", each [Value] > 100)
in
    Source
```

A. エラーを無視する  
B. try...otherwise を使用する  
C. フィルタ条件を変更する  
D. エラーを置換する

---

**解答**: B

**解説**:  
- `try...otherwise` を使用することで、エラーが発生した場合に代替値を返す処理を実現できます。  
- 実装例：
  ```M
  try 
      Table.SelectRows(
          #"Previous Step", 
          each [Value] > 100
      ) 
  otherwise 
      Table.FromRecords({})
  ```

---

### 問題 6: データ型の不一致エラー
2つのテーブルを結合する際、「キー列のデータ型が一致していません」というエラーが発生しました。この問題を解決する方法は？

A. データ型を一致させる  
B. 列を削除する  
C. テーブルをピボット化する  
D. 条件付き列を追加する

---

**解答**: A

**解説**:  
- 結合キー列のデータ型を一致させることが必須です。例えば、片方のキーが数値型（Int64）で、もう片方が文字列型（Text）の場合はエラーが発生します。  
- 実装例：
  ```M
  Table.TransformColumnTypes(
      TableA, 
      {
          {"KeyColumn", type text}
      }
  )
  ```

---

### 問題 7: データのピボット解除
以下のデータがあります：

|Product|2022|2023|
|-------|----|----|
| A     | 100| 150|
| B     | 200| 250|

このデータを以下の形式に変換するには、どの操作を使用すべきですか？

| Year | Product | Sales |
|------|---------|-------|
| 2022 | A       | 100   |
| 2022 | B       | 200   |
| 2023 | A       | 150   |
| 2023 | B       | 250   |

A. 列の分割  
B. ピボット解除  
C. 行の削除  
D. 条件付き列  

---

**解答**: B

**解説**:  
- ピボット解除（Unpivot Columns）操作を使用すると、複数の列を行に変換できます。  
- この場合、「2022」と「2023」の列をピボット解除して、「Year」列と「Sales」列を作成します。  
- 実装例：
  ```M
  let
      Source = Table.FromRows({
          {"A", 100, 150},
          {"B", 200, 250}
      }, {"Product", "2022", "2023"}),
      #"Unpivoted Columns" = 
          Table.UnpivotOtherColumns(
              Source, 
              {"Product"}, 
              "Year", 
              "Sales"
          )
  in
      #"Unpivoted Columns"
  ```

---

### 問題 8: 動的パラメータの使用
次のクエリで動的に変化する値を使用するには、どの手法を使用しますか？

```M
let
    Source = Table.SelectRows(#"Previous Step", each [Category] = "A")
in
    Source
```

A. ハードコーディング  
B. パラメータ  
C. 列の結合  
D. マージクエリ

---

**解答**: B

**解説**:  
- パラメータを設定することで、動的な値を使用できます。  
- 実装例：
  ```M
  let
      ParameterValue = "A",
      Source = Table.SelectRows(#"Previous Step", each [Category] = ParameterValue)
  in
      Source
  ```

---

### 問題 9: クエリのステップ管理
以下のような複数ステップのクエリがありますが、特定のステップを無効にするにはどうしますか？

```M
Step1 = Source,
Step2 = Table.RemoveColumns(Step1, {"Column1"}),
Step3 = Table.Sort(Step2, {"Column2"})
```

**解答**:  
Power Queryエディターで該当ステップを右クリックし、「ステップを無効化」を選択します。

---

### **問題 10: データの更新**
Power BIレポートでデータを自動更新するには、どの設定が必要ですか？

**解答**:  
Power BIサービスでスケジュール更新を設定し、データの更新を自動化できます。