(Base de datos) Fila a columna (unpivot), columna a fila (pivot) en SQL

1. Fila a columnaunpivot()

Esta es una función de SQLServer, no disponible en MySQL

1.1 Objetivos

Convierta la siguiente tabla 1 al formato que se muestra en la tabla 2

IDENTIFICACIÓN Teléfono1 Teléfono2
1 11 12
2 21 23
IDENTIFICACIÓN Número de teléfono Tipo de telefono
1 11 Teléfono1
1 12 Teléfono2
2 21 Teléfono1
2 22 Teléfono2

1.2 Código y explicación

Dependiendo de los requisitos del objetivo, necesitamos:

  1. Cree dos nuevas columnas Phone_num, Phone_type
  2. Elimine las columnas Phone1, Phone2 de la tabla anterior y use sus nombres de columna como elementos de la nueva columna Phone_type
  3. Rellene estas dos nuevas columnas en función del ID
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. Columna a filapivot()

El objetivo es el contrario al de la parte anterior:

IDENTIFICACIÓN Número de teléfono Tipo de telefono
1 11 Teléfono1
1 12 Teléfono2
2 21 Teléfono1
2 22 Teléfono2
IDENTIFICACIÓN Teléfono1 Teléfono2
1 11 12
2 21 23

Dependiendo del objetivo, necesitamos:

  1. Elimine las columnas Phone_num, Phone_type de la tabla anterior y use sus elementos como los nombres de columna de la nueva tabla
  2. Cree estas dos nuevas columnas Phone1, Phone2
  3. Complete una nueva columna basada en ID y 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;

Supongo que te gusta

Origin blog.csdn.net/weixin_43728138/article/details/123635563
Recomendado
Clasificación