Filas en columnas (que problema!)

21/06/2006 - 13:47 por Matías | Informe spam
Hola a todos; antes que nada aclaro que ya he leido en distintos articulos y
post anteriores e intentado hacer esto de convertir filas
en columnas(usando cursores y sql dinamico) y no lo he logrado, no pretendo
que me resuelvan el 100% de mi problema, pero necesito una mano para
empezar,
no me importa el metodo para lograrlo(cursores, sql dinamico, tablas temp.,
golpe de estado, lo que sea); estoy con sql2000.

Tengo el resultado de la consulta(con columnas resumidas):

Alumno Materia Nota IDEtapa Promedio
JUAN Biologia 6 1 5.5
JUAN Biologia 5 1 5.5
JUAN Biologia 4 2 6
JUAN Biologia 7 2 6
JUAN Historia 8 1 7
JUAN Historia 6 1 7
JUAN Historia 2 2 5
JUAN Historia 9 2 5
JUAN Historia 4 2 5

Y me hace falta de la siguiente forma:

Alumno Materia N1_1 N2_1 N1_2 N2_2 N3_2 Pro_1 Pro_2
JUAN Biologia 6 5 4 7 5.5
6
JUAN Historia 8 6 2 9 4 7
5

donde por ej; N1_1 significa Nota 1 de la etapa 1, N1_2 Nota1 de la etapa 2.

SELECT A.Apellidos+', '+A.Nombres as Alumno, A.Legajo, M.Nombre as Materia,
N1.Nota, N1.IDEtapa, E.Descripcion as Etapa,
N1.Curso,
Promedio = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.IDEtapa = N1.IDEtapa AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND DATEPART(yyyy, N2.FechaExamen) = @Anio)
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE N1.IdAlumno = @IdAlumno AND N1.IDEtapa = 1 AND DATEPART(yyyy,
N1.FechaExamen) = @Anio
UNION
SELECT A.Apellidos+', '+A.Nombres as Alumno, A.Legajo, M.Nombre as Materia,
N1.Nota, N1.IDEtapa, E.Descripcion as Etapa,
N1.Curso,
Promedio = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.IDEtapa = N1.IDEtapa AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND DATEPART(yyyy, N2.FechaExamen) = @Anio)
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE N1.IdAlumno = @IdAlumno AND N1.IDEtapa = 2 AND DATEPART(yyyy,
N1.FechaExamen) = @Anio

Muchas gracias por su tiempo.

PD: por las dudas coloco el script de la tabla NOTAS
CREATE TABLE [dbo].[Notas] (
[IDAlumno] [int] NOT NULL ,
[IDMateria] [smallint] NOT NULL ,
[IDEtapa] [smallint] NOT NULL ,
[Curso] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Orden] [int] IDENTITY (1, 1) NOT NULL ,
[Nota] [smallint] NOT NULL ,
[FechaExamen] [smalldatetime] NULL
) ON [PRIMARY]

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
21/06/2006 - 19:15 | Informe spam
Matías,

Te paso un par de links muy interesantes. Uno de ellos explica como crear un
procedimiento almacenado para manejar este tipo de casos donde la cantidad de
columnas del resultado es variable.

How to rotate a table in SQL Server
http://support.microsoft.com/defaul...roduct=sql

Dynamic Cross-Tabs/Pivot Tables
http://www.sqlteam.com/item.asp?ItemID)55


AMB


"Matías" wrote:

OK, muchas gracias, te comento que tu consulta me sirve como punto de
partida, ya que tengo unos cuantos sp's que tengo que pasar filas a
columnas.
Saludos y 1.000.000 de gracias



Respuesta Responder a este mensaje
#7 Maxi
22/06/2006 - 02:51 | Informe spam
Hola, yo en sql2000 aconsejo resolver esto desde el lado de la aplicacion,
por lo general es mucho mas eficiente que el mismo motor. En sql2005 la cosa
cambia considerablemente y podrias por ej usar PIVOT


Salu2
-
[Microsoft MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org

MSN:

"Matías" escribió en el mensaje
news:
Hola a todos; antes que nada aclaro que ya he leido en distintos articulos
y
post anteriores e intentado hacer esto de convertir filas
en columnas(usando cursores y sql dinamico) y no lo he logrado, no
pretendo
que me resuelvan el 100% de mi problema, pero necesito una mano para
empezar,
no me importa el metodo para lograrlo(cursores, sql dinamico, tablas
temp.,
golpe de estado, lo que sea); estoy con sql2000.

Tengo el resultado de la consulta(con columnas resumidas):

Alumno Materia Nota IDEtapa Promedio
JUAN Biologia 6 1 5.5
JUAN Biologia 5 1 5.5
JUAN Biologia 4 2 6
JUAN Biologia 7 2 6
JUAN Historia 8 1 7
JUAN Historia 6 1 7
JUAN Historia 2 2 5
JUAN Historia 9 2 5
JUAN Historia 4 2 5

Y me hace falta de la siguiente forma:

Alumno Materia N1_1 N2_1 N1_2 N2_2 N3_2 Pro_1 Pro_2
JUAN Biologia 6 5 4 7 5.5
6
JUAN Historia 8 6 2 9 4
7
5

donde por ej; N1_1 significa Nota 1 de la etapa 1, N1_2 Nota1 de la etapa
2.

SELECT A.Apellidos+', '+A.Nombres as Alumno, A.Legajo, M.Nombre as
Materia,
N1.Nota, N1.IDEtapa, E.Descripcion as Etapa,
N1.Curso,
Promedio = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.IDEtapa = N1.IDEtapa AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND DATEPART(yyyy, N2.FechaExamen) = @Anio)
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE N1.IdAlumno = @IdAlumno AND N1.IDEtapa = 1 AND DATEPART(yyyy,
N1.FechaExamen) = @Anio
UNION
SELECT A.Apellidos+', '+A.Nombres as Alumno, A.Legajo, M.Nombre as
Materia,
N1.Nota, N1.IDEtapa, E.Descripcion as Etapa,
N1.Curso,
Promedio = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.IDEtapa = N1.IDEtapa AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND DATEPART(yyyy, N2.FechaExamen) = @Anio)
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE N1.IdAlumno = @IdAlumno AND N1.IDEtapa = 2 AND DATEPART(yyyy,
N1.FechaExamen) = @Anio

Muchas gracias por su tiempo.

PD: por las dudas coloco el script de la tabla NOTAS
CREATE TABLE [dbo].[Notas] (
[IDAlumno] [int] NOT NULL ,
[IDMateria] [smallint] NOT NULL ,
[IDEtapa] [smallint] NOT NULL ,
[Curso] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Orden] [int] IDENTITY (1, 1) NOT NULL ,
[Nota] [smallint] NOT NULL ,
[FechaExamen] [smalldatetime] NULL
) ON [PRIMARY]


Respuesta Responder a este mensaje
#8 marco
26/06/2006 - 18:09 | Informe spam
Me permito recomendarte esta colaboración en el sitio de El Guille:

http://www.elguille.info/colabora/N...uzadas.htm

Creo que unos pocos cambios puedes resolver tu problema

Saludos

Marco Padierna

"Matías" escribió en el mensaje
news:
Hola a todos; antes que nada aclaro que ya he leido en distintos articulos
y
post anteriores e intentado hacer esto de convertir filas
en columnas(usando cursores y sql dinamico) y no lo he logrado, no
pretendo
que me resuelvan el 100% de mi problema, pero necesito una mano para
empezar,
no me importa el metodo para lograrlo(cursores, sql dinamico, tablas
temp.,
golpe de estado, lo que sea); estoy con sql2000.

Tengo el resultado de la consulta(con columnas resumidas):

Alumno Materia Nota IDEtapa Promedio
JUAN Biologia 6 1 5.5
JUAN Biologia 5 1 5.5
JUAN Biologia 4 2 6
JUAN Biologia 7 2 6
JUAN Historia 8 1 7
JUAN Historia 6 1 7
JUAN Historia 2 2 5
JUAN Historia 9 2 5
JUAN Historia 4 2 5

Y me hace falta de la siguiente forma:

Alumno Materia N1_1 N2_1 N1_2 N2_2 N3_2 Pro_1 Pro_2
JUAN Biologia 6 5 4 7 5.5
6
JUAN Historia 8 6 2 9 4
7
5

donde por ej; N1_1 significa Nota 1 de la etapa 1, N1_2 Nota1 de la etapa
2.

SELECT A.Apellidos+', '+A.Nombres as Alumno, A.Legajo, M.Nombre as
Materia,
N1.Nota, N1.IDEtapa, E.Descripcion as Etapa,
N1.Curso,
Promedio = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.IDEtapa = N1.IDEtapa AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND DATEPART(yyyy, N2.FechaExamen) = @Anio)
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE N1.IdAlumno = @IdAlumno AND N1.IDEtapa = 1 AND DATEPART(yyyy,
N1.FechaExamen) = @Anio
UNION
SELECT A.Apellidos+', '+A.Nombres as Alumno, A.Legajo, M.Nombre as
Materia,
N1.Nota, N1.IDEtapa, E.Descripcion as Etapa,
N1.Curso,
Promedio = (SELECT ROUND(AVG(CAST(N2.Nota as FLOAT)),2)
FROM NOTAS N2
WHERE N2.IDEtapa = N1.IDEtapa AND N2.IDMateria = N1.IDMateria AND
N2.IdAlumno = N1.IdAlumno AND DATEPART(yyyy, N2.FechaExamen) = @Anio)
FROM NOTAS N1
INNER JOIN Materias M ON N1.IDMateria = M.IDMateria
INNER JOIN Alumnos A ON N1.IDAlumno = A.IDAlumno
INNER JOIN Etapas E ON N1.IDEtapa = E.IDEtapa
WHERE N1.IdAlumno = @IdAlumno AND N1.IDEtapa = 2 AND DATEPART(yyyy,
N1.FechaExamen) = @Anio

Muchas gracias por su tiempo.

PD: por las dudas coloco el script de la tabla NOTAS
CREATE TABLE [dbo].[Notas] (
[IDAlumno] [int] NOT NULL ,
[IDMateria] [smallint] NOT NULL ,
[IDEtapa] [smallint] NOT NULL ,
[Curso] [char] (3) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Orden] [int] IDENTITY (1, 1) NOT NULL ,
[Nota] [smallint] NOT NULL ,
[FechaExamen] [smalldatetime] NULL
) ON [PRIMARY]


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida