Ungroup + Table = UNION (ALL) (はもう過去の話)

**[2024/4/3更新: Table関数のアップデートを反映]**

# UNION ALL

PowerAppsではUNION操作は提供されていません。
UNION (ALL)とは・・・

```sql:UNIONALL
select * from number_table where num in (1,2,3)

UNION ALL

select * from number_table where num in (3,4,5)
```
この結果は、{1,2,3,3,4,5}を返します。つまり重複を排除しない、2つ以上のクエリの統合処理です。

~~Power Appsでは、このような関数は提供されていませんが、既存の2つの関数、**Ungroup**関数と**Table**関数を利用することで、同等の処理ができましたので、ご紹介します。~~
[2024/4/3更新]
Power Appsではこの操作は Table関数を利用することで実現できます。

# 準備
まずは2つのCollectionを考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/924b8f21-4f22-09ed-b2bd-4984fcbdb16b.png)

## Collect(C,A,B)
この2つのCollectionを統合する方法はいくつもあります。
例えば何らかのイベントによって、Collectionを生成するのであれば、以下のような方法がよく知られています。

```
ClearCollect(UniCol, Col1,Col2)
```
この結果生成される*UniCol*は、*Col1*と*Col2*を統合した結果、すなわちName={"AAAAAA","BBBBBB","CCC","DDD"}とそれに対応する他の列からなるCollectionとなります。
Collectionを生成してもよい場合、または、Collectionを生成する明確なイベントが存在する場合には、この操作で充分です。

反対に、Collectionを生成するイベントが明確になく、ギャラリーやデータテーブルに統合した結果を表示したい場合には、ここで紹介するUngroup+Tableの組み合わせが有効になります。

(実際、Collectionを生成すると、そのCollectionをどのタイミングで更新するか/破棄するかという課題が発生します)

## Multiple Datasource
複数のデータソースが存在する場合、例えば2つ以上のSharePointリストに(部分的に)同じ列をもつデータが存在し、データを統合して表示したい場合にもUngroup+Tableが有効です。
例えば、現在の案件のリストとArchiveの案件のリストが分かれていた場合、その2つのデータを合算するようなシーンで利用できます。

# UNION ALL = Ungroup+Table (だったけど今はTable)
再び2つのCollection - Col1, Col2を考えます。この2つのCollectionを統合した結果を、例えばギャラリーに表示する場合には以下のような数式をItemsプロパティに設定すればよいです。

```Gallery.Items
Table(Col1, Col2)
```
とても簡単ですね。

**[2024/4/3更新] 以下はすでに不要な操作です。覚えておいても損はないけど。**

```Gallery.Items
Ungroup(
 Table(
  {TableName:Col1}, {TableName:Col2}
 ), "TableName"
)
```
Table関数は複数のレコードからTableを生成する関数で、もちろん結果はTable型になります。
Ungroupは、グループ化された列を含むテーブルのグループ化を解く関数で、例えば以下のような操作に対応します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/caa930cd-aa43-0308-5551-efb31c430e27.png)

これを踏まえると、Ungroup+Tableの方法はちょうど、以下のような操作をしていることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/e2189a18-278d-9455-032a-3251123f90fa.png)
つまり、複数のCollectionまたはデータ取得結果を、Tableの1つの列にネストした形で挿入し、それをUngroupで解くことで、データを統合しているということです。

繰り返しですが、これをギャラリーやデータテーブルに直接設定することができます。ですので、片方のCollectionにアイテムを追加するたびに、統合したCollectionを作りなおすというコストはありません。

## Revisit Multiple Datasource
単一のリストから、複数の条件で結果を抽出したい場合(カテゴリーでのフィルター等)には、Filter内の条件式にOr関数を使えば、多くの場合期待される結果を取得できます。
一方で、複数のリストから結果を取得し、表示したいような場合には、単純ではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/938e9b2c-2f33-855a-ecda-fb855ca8b38b.png)
もちろん、結果の足し算はできません。

例として、*Opportunity*という名前のリストと、*Opportunity Archive*という名前のリストから、特定の条件でフィルターして、データを統合表示するような場合を考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/63813fef-1421-cbf1-1a54-84958c9dc850.png)

この場合の表示条件は、OpportunityはステータスがCloseのアイテムのみ、Archive側はすべてのアイテムとします。
また、年度がわかるように、すべてのアイテムでFYを表示することにします。

この時、データテーブルのItemsプロパティは以下のようにかけます。

```DataTable.Items
Ungroup(
    Table(
        {TableName:AddColumns(Filter(Opportunity,Status.Value="Close"),"FY",2020)},
        {TableName:'Opportunity Archive'}
        ),
    "TableName"
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/7b0cb878-d2e5-930c-7037-a246c0dfe660.png)

最初のリスト部分で少しデータ操作をしていますが、基本はCollectionの場合と同様です。

ここでは2つのリストの統合をしていますが、3つ以上でも同様ですので、試してみてください。

# おわりに
今回はPowerAppsの枠組みの中で、UNION ALLと同等の操作を行う方法を紹介しました。
このほかにも、INNER JOINであったり、OUTER JOINと同等の操作をPower Appsで行うこともできますので、ぜひ挑戦してみてください！

ヒントはこのツイートのスレッドにあります👇

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Did you know the Union operation in <a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> ?<br>↓↓ <a href="https://t.co/FAkwJpPezn">pic.twitter.com/FAkwJpPezn</a></p>&mdash; Hiro (@mofumofu_dance) <a href="https://twitter.com/mofumofu_dance/status/1212716358573551616?ref_src=twsrc%5Etfw">January 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## CROSS JOIN

例えば単純なテーブルの外積であれば、

| Num       | 
|:-----------------|
| 1            |
| 2           |
| 3             |
| 4            |
| 5           |
| 6             |
と

| Alp       | 
|:-----------------|
| A            |
| B           |
| C             |
| D             |
の外積は

```
Ungroup(
    AddColumns(
        Table({Num:1},{Num:2},{Num:3},{Num:4},{Num:5},{Num:6}),
        "AddTable",
        Table({Alp:"A"},{Alp:"B"},{Alp:"C"},{Alp:"D"})),"AddTable")
```
このように書けます。