PUBLICIDAD
Wilas

SQL Server 2005- Pivot o Cursores? Filas a columnas

DieX

ANÓNIMO
Deberiamos tener un subforo de programacion pero bueno...lo abro aki

LLevo rato intentado cuadrar esta consulta este es el escenario, tengo unprograma que al inicio y cierre de secion, se guarda en una tabla de logueo, el id de usuario-fecha-tipo(1 para inicio,2 para cierre) y despues se requiere ver por semana quienes se logearon y a que hora.


Por ejemplo esta seria la tabla de log

idUsuario----Tipo--------------Fecha
1----------------1-----------------Nov 25 2009 10:41PM
1----------------2-----------------Nov 25 2009 10:42PM
2---------------- 1-----------------Nov 25 2009 10:45PM
2----------------2 -----------------Nov 25 2009 10:47PM
2----------------1-----------------Nov 26 2009 9:49AM
2---------------- 2-----------------Nov 26 2009 9:49AM
1---------------- 1-----------------Nov 26 2009 9:49AM
1---------------- 2-----------------Nov 26 2009 9:49AM

Esa misma la paso a la siguiente tabla temporal

IDusuario-------Dia--------Hora--------Tipo
1.............. Miércoles....22:41......1
1..............Miércoles.....22:42......2
2..............Miércoles.....22:45......1
2..............Miércoles.....22:47......2
2..............Jueves ........9:49......1
2..............Jueves ........9:50...... 2
1..............Jueves........9:51...... 1
1..............Jueves........9:55......2

Y lo que quiero retornar es

Idusuario tipo Miercoles Jueves
1 ..............1................22:41.............9:49
1 ..............2................22:42.............9:50
2 ..............1................22:45.............9:51
2 .............. 2................ 22:47............9:55

He estado investigando mucho rato acerca de cursores y Fecth, pero esa me da un error por en las columnas "nuevas" miercoles y jueves lo llena de "null"(adjunto el script por si alguien lo puede revisar, se cae a la ahora de actualizar las columnas) ....tambien estube revisando el uso del PIVOT pero no me quedo muy claro y no lo he podido cuadrar

Por Favor si alguien me puede ayudar seria de gran ayuda ! ! ! ! !




Code:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		
-- Create date: 
-- Description:	 Este procedimiento se encarga de consultar la tabla de logueo
-- Donde las fechas coincidan, posteriormente crea un tabla curzada donde 
-- se aprecien las columnas correspondientes a los dias de la semana, 
-- conteniendo en cada campo el usuario, el tipo de registro y la hora
-- =============================================



ALTER PROCEDURE LogeoSelect
--(
	--@fecha1	varchar(20),
	--@fecha2	varchar(20)
--)
AS

SET NOCOUNT ON

-- crear tabla temporal de datos filtrados
if exists (select * from tab1)
drop table tab1
GO
---- ojo: en esta la fecha es nvarchar
CREATE TABLE tab1 (idusuario int NOT NULL, fecha nvarchar(20) NOT NULL, hora nvarchar(20) NOT NULL, tipo int NULL)
GO


-- insertar datos filtrados, con la fecha convertida al dia correspondiente

INSERT INTO tab1 (idusuario, fecha,hora, tipo) 
	SELECT  idcuentas,
			datename(dw,fecha),
            datename(hh,fecha)+':'+datename(n,fecha),
			tipo
	FROM 
		logeo
	WHERE
		fecha BETWEEN  'Nov 01 2009' AND 'Nov 27 2009' 



if exists (select * from tab2) 
drop table tab2
GO

--tabla de resultados
CREATE TABLE tab2 (usuario int, tipo int)
GO

-- insertar usuarios
INSERT INTO tab2 (usuario,tipo)
	SELECT  idusuario,tipo FROM tab1

-- cursor
DECLARE encabezados CURSOR FOR 
	SELECT  fecha FROM tab1

-- abrir cursor
OPEN encabezados



-- variable para crear las columnas
DECLARE @encabezado nvarchar(50)
-- variables para definir las consultas en tiempo de ejecución
DECLARE @exec1 nvarchar(100)
DECLARE @exec2 nvarchar(100)

--Variable para comparar si ya se añadio la columna
DECLARE @tempE  nvarchar(50)
--  crear cursor para recorrer la tabla de datos filtrados
FETCH NEXT FROM encabezados INTO @encabezado


	
-- mientras haya datos...
WHILE @@FETCH_STATUS = 0


BEGIN
	-- por cada fecha, agregar una columna

SET @exec1 = 'ALTER TABLE tab2 ADD [' + @encabezado + '] nvarchar(20) '	
--Si es igual a tempE significa que ya fue agregada
if not @tempE = @encabezado
	EXECUTE (@exec1)

	-- actualizar la columna nueva con los valores

--AQUI SE ESTA CAYENDO
	SET @exec2 = 'UPDATE tab2 SET ' +  @encabezado + ' = t1.hora ' +
          'FROM tab1 t1 INNER JOIN tab2 t2 ON t1.idusuario = t2.usuario ' +
		  'WHERE t1.fecha=' + @encabezado 
	EXECUTE (@exec2)
	
set @tempE = @encabezado
	-- siguiente registro
	FETCH NEXT FROM encabezados INTO @encabezado
     
END

CLOSE encabezados
DEALLOCATE encabezados


SELECT * FROM tab2

RETURN
 

Attachments

    Los archivos adjuntos solo pueden ser vistos por miembros registrados del foro.
Diex suppongo que eres un experto, bueno si lo sos o no lo unico que por el momento te puedo recomendar es esta pagina es para aprender a utilizar SQL Server desde el inicio busca en el indice talvez encuentres lo que buscas o talvez encuentres algun dato interesante hay la dejo para ti o cualquiera que necesite o este aprendiendo http://www.sqlserverya.com.ar
 
Pastorcito dijo:
Diex suppongo que eres un experto, bueno si lo sos o no lo unico que por el momento te puedo recomendar es esta pagina es para aprender a utilizar SQL Server desde el inicio busca en el indice talvez encuentres lo que buscas o talvez encuentres algun dato interesante hay la dejo para ti o cualquiera que necesite o este aprendiendo http://www.sqlserverya.com.ar

Mae experto no soy xD,,,pero ya casi lo soluciono, si a alguien le interesa saber despues cuando tenga el pivot completamente optimizado lo subo....pura vida mae gracias por el link
 

Nuevos temas

📑 Evite Incurrir en Multas y Sanciones: Ofrecemos servicios de presentación de declaraciones de IVA (D104), alquileres (D125) y renta (D101) a partir de $20 mensuales.

Posts recientes

¿Costa Rica debería reelegir inmediatamente a Rodrigo Chaves?

  • Sí, es el mejor presidente de todos los tiempos

    Votos: 65 50,4%
  • No, mejor elegir otro candidato

    Votos: 64 49,6%
💼 Factura Electrónica sin Mensualidades ni Anualidades. Inscripción gratis en Hacienda.
#1 en FACTURA ELECTRÓNICA
Arriba Pie