86570
Name | TEL1 | TEL2 | TEL3  
---|---|---|---  
Tarou | 000-0000-0000 | 111-1111-1111 | 222-2222-2222  
Hanako | 333-3333-3333 | 444-4444-4444 | NULL  
  
という一つのテーブルに同じ項目を複数持っているようなものをばらして

Name | TEL  
---|---  
Tarou | 000-0000-0000  
Tarou | 111-1111-1111  
Tarou | 222-2222-2222  
Hanako | 333-3333-3333  
Hanako | 444-4444-4444  
  
という感じのViewを作りたいです。  
どのようなSQL文を書けばいいでしょうか。
CC BY-SA 4.0
2022-02-25T05:52:02.187
86569
2022-03-01T05:52:12.973
2022-02-25T09:48:47.980
18637
18637
question
sql
SQLで複数列のデータを一つにまとめるViewを作りたい
Name, TEL1 と Name, TEL2 と Name, TEL3 との select 文をそれぞれ  
union all して、 Name で order by すればいいのではなｋでしょうか。
CC BY-SA 4.0
2022-02-25T07:20:14.547
86570
2022-02-25T07:20:14.547
43029
86569
answer
既に正攻法で解決済みですが、別解としてOracle 11g R1以降ならば`Unpivot`構文で横行を縦列に変換できます。  
参考資料: [Oracle 11g
R1新機能のPivotとUnPivot](https://codezine.jp/article/detail/4985?p=4)

```

    select NAME, TEL
    from TEST
    unpivot include nulls (TEL for COL_NAME IN (TEL1, TEL2, TEL3))
    
```

PostgreSQLなど`cross join`できる環境であれば交差結合で結合できます。  
下記の`cross join unnest`と`cross join lateral`は同一の結果になります。  
参考資料: [SQL で縦横変換まとめ（pivot と
unpivot）](https://qiita.com/k24d/items/79bc4828c918dfeeac34)、[MySQL - How to
unpivot columns to rows?](https://stackoverflow.com/a/64404865)

```

    SELECT A.NAME,
    X.TEL
    FROM MY_ADDRS A
    cross join unnest (
    array[TEL1, TEL2, TEL3]
    ) as X(TEL)
    /*
    cross join lateral (
    select TEL1
    union all select TEL2
    union all select TEL3
    ) as X(TEL)
    */
    
```

なお、SQL Serverにも`Unpivot`構文が用意されていますが、`include nulls`に該当するオプションが見つかりませんでした。  
代用として`cross apply`構文が利用できるようです。  
参考資料: [Include NULL values in
unpivot](https://stackoverflow.com/q/42642951)、[How to unpivot columns using
CROSS APPLY in SQL Server 2012](https://stackoverflow.com/a/48654400)
CC BY-SA 4.0
2022-03-01T05:52:12.973
86630
2022-03-01T05:52:12.973
9820
86569
answer