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

Trasponer una tabla usando un campo pivotegráfica de visualizaciones


SQL

estrellaestrellaestrellaestrellaestrella(5)
Publicado el 30 de Enero del 2003 por Ubeimar Vergara
44.684 visualizaciones desde el 30 de Enero del 2003. Una media de 63 por semana
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
44.685 visualizaciones desde el 30 de Enero del 2003. Una media de 63 por semana
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)

EnriqueK
14 de Marzo del 2005
estrellaestrellaestrellaestrellaestrella
Siempre es bueno usar un campo pivote, pero no recomiendo el uso de cursores!!!
Responder
Matías Thayer
26 de Agosto del 2005
estrellaestrellaestrellaestrellaestrella
Para ahorrar el uso del cursor, mira este codigo: http://www.webmagic.cl/rcursorsql.php
Saludos
Responder
Matías Thayer
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
sugar
29 de Marzo del 2008
estrellaestrellaestrellaestrellaestrella
Lo hizo mi chico..debe ser muy bueno :]
Responder
Lukas
05 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

http://lwp-l.com/s504