sql - sintaxis - unpivot oracle
Desenviar con nombre de columna (2)
También puede probar el método de desvinculación sql estándar utilizando una secuencia de lógica con el siguiente código. El siguiente código tiene 3 pasos:
- crear copias múltiples para cada fila usando la combinación cruzada (también creando una columna de asunto en este caso)
- crear una columna de "marcas" y completar los valores relevantes utilizando la expresión de casos (por ejemplo: si el tema es ciencia, entonces elija el valor de la columna de ciencias)
eliminar cualquier combinación nula (si existe, la expresión de tabla se puede evitar completamente si no hay estrictamente valores nulos en la tabla base)
select * from ( select name, subject, case subject when ''Maths'' then maths when ''Science'' then science when ''English'' then english end as Marks from studentmarks Cross Join (values(''Maths''),(''Science''),(''English'')) AS Subjct(Subject) )as D where marks is not null;
Tengo una tabla StudentMarks
con columnas Name, Maths, Science, English
. Los datos son como
Name, Maths, Science, English
Tilak, 90, 40, 60
Raj, 30, 20, 10
Quiero arreglarlo de la siguiente manera:
Name, Subject, Marks
Tilak, Maths, 90
Tilak, Science, 40
Tilak, English, 60
Con unpivot puedo obtener Nombre, Marcas correctamente, pero no puedo obtener el nombre de la columna en la tabla fuente en la columna Subject
en el conjunto de resultados deseado.
¿Cómo puedo conseguir esto?
Hasta ahora he llegado a la siguiente consulta (para obtener Nombre, Marcas)
select Name, Marks from studentmarks
Unpivot
(
Marks for details in (Maths, Science, English)
) as UnPvt
Tu consulta está muy cerca. Debería poder usar lo siguiente que incluye el subject
en la lista de selección final:
select u.name, u.subject, u.marks
from student s
unpivot
(
marks
for subject in (Maths, Science, English)
) u;