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 ! ! ! ! !
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.