SQL Server 2005- Pivot o Cursores? Filas a columnas

  • Iniciador del tema Iniciador del tema DieX
  • Start date Start date
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

    Solo los foreros registrados pueden disfrutar ver los archivos adjuntos.
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
 

Últimas Noticias de Costa Rica

📑 Evite Incurrir en Multas y Sanciones: Ofrecemos servicios de presentación de declaraciones de IVA (D104), alquileres (D125) y la anual de renta (D101)

🦉Prepración para examenes desde 6to hasta Bachillerato por madurez.
¡Obtenga su título!

¿Está a favor de la portación de armas para la defensa personal?

  • Sí, para garantizar la seguridad individual

  • No, para reducir el riesgo de incidentes violentos


Los resultados solo son visibles tras votar.

TicosLand is now also available on Android and iOS

¿Las universidades públicas costarricenses son refugios de ideologías extremistas?

  • Sí, son una cueva de profesores parásitos

    Votos: 377 59,3%
  • No, son cunas del libre pensamiento

    Votos: 259 40,7%

¿Apoya la creación de una ley de eutanasia en Costa Rica?

  • Sí, por el derecho a una muerte digna

  • No, por el respeto absoluto a la vida


Los resultados solo son visibles tras votar.

En tendencia

¿Costa Rica debería promover abiertamente el turismo sexual?

  • Sí, podría dar un impulso económico

  • No, debido a las implicaciones morales y sociales negativas


Los resultados solo son visibles tras votar.

🚀 FACTURATica.com la #1 sin Mensualidades ni Anualidades. Inscripción gratis en Hacienda.

¿Estaría de acuerdo en la pena de muerte para crímenes graves y flagrantes?

  • Sí y también para la corrupción

  • No, por el riesgo de errores judiciales y la ética de la vida


Los resultados solo son visibles tras votar.

¿Debería Costa Rica legalizar la marihuana para uso recreativo?

  • Sí, por los beneficios económicos y de seguridad

  • No, debido a los potenciales riesgos para la salud y la sociedad


Los resultados solo son visibles tras votar.
Atrás
Arriba