/*
// 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)
Saludos
( a ver si aguanta los tags html :P)
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...