(データベース)SQLの行から列(ピボット解除)、列から行(ピボット)

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コードと説明

ターゲット要件に応じて、次のことを行う必要があります。

  1. 2つの新しい列Phone_num、Phone_typeを作成します
  2. 古いテーブルのPhone1、Phone2列を削除し、それらの列名を新しい列Phone_typeの要素として使用します
  3. 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

目標に応じて、次のことを行う必要があります。

  1. 古いテーブルのPhone_num、Phone_type列を削除し、それらの要素を新しいテーブルの列名として使用します
  2. これらの2つの新しい列Phone1、Phone2を作成します
  3. 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;

おすすめ

転載: blog.csdn.net/weixin_43728138/article/details/123635563