Código de SQL - Trasponer una tabla usando un campo pivote

sin imagen de perfil

Trasponer una tabla usando un campo pivotegráfica de visualizaciones


SQL

Publicado el 30 de Enero del 2003 por Ubeimar Vergara
47.383 visualizaciones desde el 30 de Enero del 2003
Query en SQL Server que permite trasponer una Tabla. Código a manera de Script muy simple para convertirlo en Procedimiento Almacenado o en una función de usuario.

Versión 1
estrellaestrellaestrellaestrellaestrella(5)

Publicado el 30 de Enero del 2003gráfica de visualizaciones de la versión: Versión 1
47.384 visualizaciones desde el 30 de Enero del 2003
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
// Funcion: Trasponer una tabla usando un campo pivote.
//
// Parametros:
//   @Tabla - Nombre de la Tabla a pivotear.
//   @CampoPivote - Columna que se desea usar como pivote.
//
// Restricciones:
//   - La tabla no debe tener muchas filas (probado hasta 10 filas).
//   - La tabla no debe tener columnas tipo BIT.
//   - La columna Pivote, debe tener todos los valores diferentes.
//
// Fecha de Creacion:
//   22/ENE/2003
*/
 
DECLARE @I INT -- Se usa para generar los alias de las tablas en el @SQL.
DECLARE @Registros INT -- Para obtener el numero de registros (filas) de la tabla.
 
DECLARE @Campo VARCHAR(50)
DECLARE @CampoPivote VARCHAR(50)
DECLARE @Tabla VARCHAR(20)
DECLARE @SQL VARCHAR(8000)
 
SET @Tabla = 'tblEstado'
SET @CampoPivote = 'EST_Regional'
 
CREATE TABLE ##Campos
( Campo VARCHAR(50) )
	EXEC('INSERT INTO ##Campos SELECT ' + @CampoPivote + ' FROM ' + @Tabla)
 
DECLARE Tabla CURSOR FOR
	SELECT * FROM ##Campos
 
SET @SQL = 'CREATE TABLE ##Pivote ( A VARCHAR(50),'
 
OPEN Tabla
FETCH NEXT FROM Tabla INTO @Campo
	WHILE @@FETCH_STATUS = 0
	BEGIN
		SET @SQL = @SQL + @Campo + ' VARCHAR(50)'
		FETCH NEXT FROM Tabla INTO @Campo
		IF @@FETCH_STATUS = 0
			SET @SQL = @SQL + ','
	END
	EXEC(@SQL + ' )')
CLOSE Tabla
DEALLOCATE Tabla
 
DROP TABLE ##Campos
 
CREATE TABLE ##Registros
( Cantidad INT )
	EXEC ('INSERT INTO ##Registros SELECT COUNT(1) FROM ' + @Tabla)
	SELECT @Registros = Cantidad FROM ##Registros
	DROP TABLE ##Registros
 
DECLARE Campos CURSOR FOR
	SELECT B.name FROM sysobjects A
	INNER JOIN syscolumns B ON
	A.ID = B.ID
	WHERE A.name = @Tabla
	ORDER BY B.colid
 
OPEN Campos
FETCH NEXT FROM Campos INTO @Campo
	WHILE @@FETCH_STATUS = 0
	BEGIN
		IF UPPER(@Campo) <> UPPER(@CampoPivote)
		BEGIN
			SET @SQL = 'INSERT INTO ##Pivote SELECT ''' + @Campo + ''','
			SET @I = 1
			WHILE @I <= @Registros
			BEGIN
				SET @SQL = @SQL + 'CAST(MIN(A' + RTRIM(LTRIM(CAST(@I AS VARCHAR))) + '.' + @Campo + ') AS VARCHAR)'
				IF @I < @Registros
					SET @SQL = @SQL + ','
				SET @I = @I + 1
			END
			SET @SQL = @SQL + ' FROM ' + @TABLA + ' A1 '
			SET @I = 2
			WHILE @I <= @Registros
			BEGIN
				SET @SQL = @SQL + 'INNER JOIN ' + @Tabla + ' A'+ RTRIM(LTRIM(CAST(@I AS VARCHAR))) + ' ON '
				SET @SQL = @SQL + 'A' + RTRIM(LTRIM(CAST((@I - 1) AS VARCHAR))) + '.' + @CampoPivote + '<A' + RTRIM(LTRIM(CAST(@I AS VARCHAR))) + '.' + @CampoPivote + ' '
				SET @I = @I + 1
			END
			EXEC(@SQL)
		END
		FETCH NEXT FROM Campos INTO @Campo
	END
CLOSE Campos
DEALLOCATE Campos
 
SELECT * FROM ##Pivote
DROP TABLE ##Pivote



Comentarios sobre la versión: Versión 1 (5)

14 de Marzo del 2005
estrellaestrellaestrellaestrellaestrella
Siempre es bueno usar un campo pivote, pero no recomiendo el uso de cursores!!!
Responder
26 de Agosto del 2005
estrellaestrellaestrellaestrellaestrella
Para ahorrar el uso del cursor, mira este codigo: http://www.webmagic.cl/rcursorsql.php
Saludos
Responder
26 de Agosto del 2005
estrellaestrellaestrellaestrellaestrella
Perdón, era <a href \\\"http://www.webmagic.cl/rcrosstabsql.php\\\"> http://www.webmagic.cl/rcrosstabsql.php </a>

( a ver si aguanta los tags html :P)
Responder
29 de Marzo del 2008
estrellaestrellaestrellaestrellaestrella
Lo hizo mi chico..debe ser muy bueno :]
Responder
5 de Noviembre del 2008
estrellaestrellaestrellaestrellaestrella
hola oye muy bien el codigp ! <

yo te queria preguntar si me puedesa ayudar en un codigo para sql ! donde sea un administrador y un usuario (x) y ke estos manejen distintos roles y distintos privilegios "xs" numero ! es para una dulceria ! donde Administrador es = y Empleado es = usuario...
GRACIAS !Y ESPERO TU RESPUESTA...
Responder

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s504