Convertit filas a columas con datos alfanumericos

18/12/2008 - 17:48 por Jorge Guillen | Informe spam
Hola a todos
Tengo SQL Server 2000, bajo WinServer 2003.
He logrado convertir filas en columnas, pero con datos numericos, mediante
un sum().
Ahora, en vez de datos numericos, necesito tener datos alfanumericos...
¿como hago?

Tengo las siguientes tablas:

T_MAE_HORAS (IDE_HORA INT, DES_HORA CHAR(5))

IDE_HORA DES_HORA
1 00:00
2 00:30
3 01:00
4 01:30
5 02:00
6 02:30
7 03:00

T_MAE_SALA (IDE_SALA INT, DES_SALA VARCHAR(20))

IDE_SALA DES_SALA
1 SALA 01
2 SALA 02
3 SALA 03
4 SALA 04

Y mediante este codigo, obtengo las filas en columnas:

SET NOCOUNT ON
DECLARE @SALA VARCHAR(50)
DECLARE @SQL VARCHAR(5000)

CREATE TABLE #TREP(HORA VARCHAR(5),SALA VARCHAR(50),VALOR INT)
INSERT INTO #TREP
SELECT H.DES_HORA,S.DES_SALA,0 FROM T_MAE_HORAS H CROSS JOIN T_MAE_SALA S

SET @SQL = " SELECT HORA"

DECLARE CUR CURSOR FOR
SELECT DISTINCT SALA FROM #TREP ORDER BY SALA
OPEN CUR
FETCH CUR INTO @SALA
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = @SQL + ",SUM(CASE SALA WHEN '"+@SALA+"' THEN VALOR ELSE 0 END)
AS ["+@SALA+"]"
FETCH CUR INTO @SALA
END
CLOSE CUR
DEALLOCATE CUR

SET @SQL = @SQL + " FROM #TREP "
SET @SQL = @SQL + " GROUP BY HORA "
SET @SQL = @SQL + " ORDER BY HORA "

EXEC (@SQL)
DROP TABLE #TREP

El resultado de esto es:

HORA SALA 01 SALA 02 SALA 03 SALA 04
00:00 0 0 0 0
00:30 0 0 0 0
01:00 0 0 0 0
01:30 0 0 0 0
02:00 0 0 0 0
02:30 0 0 0 0
03:00 0 0 0 0

Ahora lo que deseo reemplazar es la sgte linea:
SELECT H.DES_HORA,S.DES_SALA,0 FROM T_MAE_HORAS H CROSS JOIN T_MAE_SALA S
Por esta:
SELECT H.DES_HORA,S.DES_SALA,'TEXTO' FROM T_MAE_HORAS H CROSS JOIN
T_MAE_SALA S
Obviamente cambiar la definicion del campo VALOR de INT a un CHAR o VARCHAR

Y obtener esto:

HORA SALA 01 SALA 02 SALA 03 SALA 04
00:00 TEXTO TEXTO TEXTO TEXTO
00:30 TEXTO TEXTO TEXTO TEXTO
01:00 TEXTO TEXTO TEXTO TEXTO
01:30 TEXTO TEXTO TEXTO TEXTO
02:00 TEXTO TEXTO TEXTO TEXTO
02:30 TEXTO TEXTO TEXTO TEXTO
03:00 TEXTO TEXTO TEXTO TEXTO

La linea: SET @SQL = @SQL + ",SUM(CASE SALA WHEN '"+@SALA+"' THEN VALOR
ELSE 0 END) AS ["+@SALA+"]"
No me va a funcionar porque hace un SUM y ahora ya no tengo valores
numericos.

¿Como hago?

Saludos y disculpen lo extenso del correo
JORGE
 

Leer las respuestas

#1 Alejandro Mesa
18/12/2008 - 19:49 | Informe spam
Jorge Guillen,

Claro que no va a funcionar. Para ese caso trata de usar otra funcion de
grupo como MIN o MAX.

SET @SQL = @SQL + ",
MIN(CASE SALA WHEN '"+@SALA+"' THEN VALOR END) AS ["+@SALA+"]"


AMB


"Jorge Guillen" wrote:

Hola a todos
Tengo SQL Server 2000, bajo WinServer 2003.
He logrado convertir filas en columnas, pero con datos numericos, mediante
un sum().
Ahora, en vez de datos numericos, necesito tener datos alfanumericos...
¿como hago?

Tengo las siguientes tablas:

T_MAE_HORAS (IDE_HORA INT, DES_HORA CHAR(5))

IDE_HORA DES_HORA
1 00:00
2 00:30
3 01:00
4 01:30
5 02:00
6 02:30
7 03:00

T_MAE_SALA (IDE_SALA INT, DES_SALA VARCHAR(20))

IDE_SALA DES_SALA
1 SALA 01
2 SALA 02
3 SALA 03
4 SALA 04

Y mediante este codigo, obtengo las filas en columnas:

SET NOCOUNT ON
DECLARE @SALA VARCHAR(50)
DECLARE @SQL VARCHAR(5000)

CREATE TABLE #TREP(HORA VARCHAR(5),SALA VARCHAR(50),VALOR INT)
INSERT INTO #TREP
SELECT H.DES_HORA,S.DES_SALA,0 FROM T_MAE_HORAS H CROSS JOIN T_MAE_SALA S

SET @SQL = " SELECT HORA"

DECLARE CUR CURSOR FOR
SELECT DISTINCT SALA FROM #TREP ORDER BY SALA
OPEN CUR
FETCH CUR INTO @SALA
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = @SQL + ",SUM(CASE SALA WHEN '"+@SALA+"' THEN VALOR ELSE 0 END)
AS ["+@SALA+"]"
FETCH CUR INTO @SALA
END
CLOSE CUR
DEALLOCATE CUR

SET @SQL = @SQL + " FROM #TREP "
SET @SQL = @SQL + " GROUP BY HORA "
SET @SQL = @SQL + " ORDER BY HORA "

EXEC (@SQL)
DROP TABLE #TREP

El resultado de esto es:

HORA SALA 01 SALA 02 SALA 03 SALA 04
00:00 0 0 0 0
00:30 0 0 0 0
01:00 0 0 0 0
01:30 0 0 0 0
02:00 0 0 0 0
02:30 0 0 0 0
03:00 0 0 0 0

Ahora lo que deseo reemplazar es la sgte linea:
SELECT H.DES_HORA,S.DES_SALA,0 FROM T_MAE_HORAS H CROSS JOIN T_MAE_SALA S
Por esta:
SELECT H.DES_HORA,S.DES_SALA,'TEXTO' FROM T_MAE_HORAS H CROSS JOIN
T_MAE_SALA S
Obviamente cambiar la definicion del campo VALOR de INT a un CHAR o VARCHAR

Y obtener esto:

HORA SALA 01 SALA 02 SALA 03 SALA 04
00:00 TEXTO TEXTO TEXTO TEXTO
00:30 TEXTO TEXTO TEXTO TEXTO
01:00 TEXTO TEXTO TEXTO TEXTO
01:30 TEXTO TEXTO TEXTO TEXTO
02:00 TEXTO TEXTO TEXTO TEXTO
02:30 TEXTO TEXTO TEXTO TEXTO
03:00 TEXTO TEXTO TEXTO TEXTO

La linea: SET @SQL = @SQL + ",SUM(CASE SALA WHEN '"+@SALA+"' THEN VALOR
ELSE 0 END) AS ["+@SALA+"]"
No me va a funcionar porque hace un SUM y ahora ya no tengo valores
numericos.

¿Como hago?

Saludos y disculpen lo extenso del correo
JORGE



Preguntas similares