1.行から列へunpivot()
これはSQLServer関数であり、MySQLでは使用できません
1.1目的
次の表1を表2に示す形式に変換します
ID | 電話1 | Phone2 |
---|---|---|
1 | 11 | 12 |
2 | 21 | 23 |
ID | Phone_num | Phone_type |
---|---|---|
1 | 11 | 電話1 |
1 | 12 | Phone2 |
2 | 21 | 電話1 |
2 | 22 | Phone2 |
1.2コードと説明
ターゲット要件に応じて、次のことを行う必要があります。
- 2つの新しい列Phone_num、Phone_typeを作成します
- 古いテーブルのPhone1、Phone2列を削除し、それらの列名を新しい列Phone_typeの要素として使用します
- IDに基づいてこれらの2つの新しい列にデータを入力します
select * from Customers
unpivot (
-- 创建新列: Phone_num
Phone_num
-- 创建新列: Phone_type
-- 删除旧列: Phone1, Phone2,并将它们的列名作为 Phone_type 的值
-- 遍历这些列名,结合ID,查找旧表中的电话数据填入 Phone_num
for Phone_type in (Phone1, Phone2)
) as up;
2.列から行へpivot()
目標は前の部分の反対です:
ID | Phone_num | Phone_type |
---|---|---|
1 | 11 | 電話1 |
1 | 12 | Phone2 |
2 | 21 | 電話1 |
2 | 22 | Phone2 |
ID | 電話1 | Phone2 |
---|---|---|
1 | 11 | 12 |
2 | 21 | 23 |
目標に応じて、次のことを行う必要があります。
- 古いテーブルのPhone_num、Phone_type列を削除し、それらの要素を新しいテーブルの列名として使用します
- これらの2つの新しい列Phone1、Phone2を作成します
- IDとPhone_typeに基づいて新しい列にデータを入力します
select * from Customers
pivot (
-- 删除旧列: Phone_nume
-- 这里必须是一个聚合函数 Aggregation,例如 sum() avg()
-- 因此这要求电话号码的格式必须为数字,不能是字符串
sum(Phone_num)
-- 创建新列: Phone1, Phone2
-- 删除旧列: Phone_type
-- 遍历这些列名,结合ID,查找旧表中的电话数据填入新表
for Phone_type in (Phone1, Phone2)
) as up;