SQL Server - duda sql -- solo para genios

 
Vista:

duda sql -- solo para genios

Publicado por super (10 intervenciones) el 23/10/2008 21:10:49
no se me puede ocurrir como hacer el siguiente problema.
poseo una base de datos de clientes y asistencias a eventos (fechas) del tipo

cliente fecha asistencia
1 20080101
2 20080104
3 20080102
3 20080104
4 200080103

y asi continuamente,
mi idea es poder pasar esta tabla a algo como lo que sigue

cliente 20080101 20080102 20080103 20080104
1 1 0 0 0
2 0 1 0 0
3 0 1 0 1
4 0 0 1 0

el real problema es que son cientos de datos de fechas.

como lo podría resolver?

muchas gracias!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:duda sql -- solo para genios

Publicado por pacopaz (131 intervenciones) el 24/10/2008 01:54:33
No creo que el query aguante cientos de registros (probablemente no llegue a los 60 sin que truene), pero dado que puedes completar un mes completo con el (si acomodas el cursor, descomentando los campos de Año y Mes), te podría servir.
Tronaría, por el tamaño máximo de las variables varchar, que es de 8000.
Lo reproduje en una tabla con esta forma:

CREATE TABLE [dbo].[Asistencia](
[Fecha] [datetime] NULL,
[Id] [int] NULL,
[Asistencia] [bit] NULL
)

El resultado es este:

declare @r_Fecha varchar(10)
declare @s_Query varchar(8000)
declare @s_Tablas varchar(6000)
declare @b_Primero int

set @s_Query = 'select '
set @s_Tablas = ' from (select distinct id from Asistencia) a'
set @b_Primero = 1
declare c_Fechas cursor for
select distinct convert(varchar(10), Fecha, 103) from Asistencia
--where Year(Fecha) = 2008 and Month(Fecha) = 1
open c_Fechas
fetch c_fechas into @r_Fecha
while @@FETCH_STATUS = 0
begin
if @b_Primero = 1
begin
set @s_Query = @s_Query + 'isnull(t' + cast(@b_Primero as varchar(1)) + '.Asistencia, 0) as [' + @r_Fecha + ']'
end
else
begin
set @s_Query = @s_Query + ', isnull(t' + cast(@b_Primero as varchar(1)) + '.Asistencia, 0) as [' + @r_Fecha + ']'
end
set @s_Tablas = @s_Tablas + ' left join ' +
'(select id, asistencia from asistencia where fecha = cast(''' +
@r_Fecha + ''' as datetime)) t' + cast(@b_Primero as varchar(1)) +
' on a.id = t' + cast(@b_Primero as varchar(1)) + '.id'
set @b_Primero = @b_Primero + 1
fetch c_fechas into @r_Fecha
end
deallocate c_Fechas
set @s_Query = @s_Query + @s_Tablas + ' order by a.Id'
exec(@s_Query)

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sql -- solo para genios

Publicado por Isaias (3308 intervenciones) el 24/10/2008 05:21:21
Si son "Cientos de Fechas", dudo mucho que cualquier codigo pensado, no funcionara.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sql -- solo para genios

Publicado por super (10 intervenciones) el 24/10/2008 14:16:06
muchas gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sql -- solo para genios

Publicado por cristian (4 intervenciones) el 24/10/2008 15:46:01
mmm...

yo tendria una tabla con el calendario completo
y una de clientes

ademas agregaria una para la union de las 2
cliente y las fechas ...

creo que por ahy iria una solucion aceptable... La otra no es muy conveniente..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:duda sql -- solo para genios

Publicado por super (10 intervenciones) el 24/10/2008 15:51:19
Cristian,
podrías poner un mini ejemplo para entender tu solución?
gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar