Como hacerlo ? Pivot ?

26/05/2009 - 02:04 por Penta | Informe spam
Estimados.
Utilizo SS2000
Tengo una tabla con asistencia.

Id, Fecha

Y lo agrupare por semanas

Algo asi:
Select id, datepart(week,fecha) Semana,count(*) Presente From TABLA
group by if,datepart(week,fecha)

Resultado:
id Semana Presente
1 14 5
1 16 2
2 14 7

Quisiera:

Id 14 15 16

1 5 0 2
2 7 0 0

Me suena a Pivot? ya se me complicó :(

PENTA.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
26/05/2009 - 02:37 | Informe spam
Penta,

Si el # de las semanas es sabido de antemano, entonces puedes usar:

select
id,
max(case when Semana = 14 then Pesente end) as sem_14,
max(case when Semana = 15 then Pesente end) as sem_15,
max(case when Semana = 16 then Pesente end) as sem_16
from
(
Select
id,
datepart(week,fecha) as Semana,
count(*) as Presente
From
TABLA
group by
id , datepart(week,fecha)
) as t
group by id;
GO


AMB


"Penta" wrote:

Estimados.
Utilizo SS2000
Tengo una tabla con asistencia.

Id, Fecha

Y lo agrupare por semanas

Algo asi:
Select id, datepart(week,fecha) Semana,count(*) Presente From TABLA
group by if,datepart(week,fecha)

Resultado:
id Semana Presente
1 14 5
1 16 2
2 14 7

Quisiera:

Id 14 15 16

1 5 0 2
2 7 0 0

Me suena a Pivot? ya se me complicó :(

PENTA.







Respuesta Responder a este mensaje
#2 Penta
26/05/2009 - 15:51 | Informe spam
Excelente !!!
Y cuando me salte alguna semana ??
Es decir tengo datos de semana 14 y 16 pero aun asi quisiera mostrar
la 15

Atte.
PENTA.
Respuesta Responder a este mensaje
#3 Penta
26/05/2009 - 16:04 | Informe spam
Ademas si me puedes explicar el tema con el max ()

Atte.
PENTA.
Respuesta Responder a este mensaje
#4 Alejandro Mesa
26/05/2009 - 17:03 | Informe spam
Penta,

Si quieres ver [semana_15] aunque no haya datos, solo debes incorporar esa
semana como una columna mas, solo que sus valores seran NULL.

En cuanto a la forma en que se simula el operador pivot, es la sgte:

- Chequea el resultado si no usamos una funcion de agripacion, en este caso
"max". Veras que las filas quedaran como:

id semana_14 semana_15 semana_16
1 17 null null
1 null 6 null
1 null null 23

Si quieres formar una sola fila, tendremos que usar una funcion de
agrupacion como min o max. No importa cual de las dos funciones se use,
puesto que el resto de filas contienen NULL en esa columna y NULL no es
tomado en cuenta por estas funciones. Entonces, la agrupacion creara:

id semana_14 semana_15 semana_16
1 17 6 23


AMB


"Penta" wrote:

Ademas si me puedes explicar el tema con el max ()

Atte.
PENTA.

Respuesta Responder a este mensaje
#5 Penta
27/05/2009 - 04:54 | Informe spam
Estimado.
Finalmente lo estoy haciendo de la manera indicada, otra duda:

select
id,
max(case when Semana = 14 then Pesente end) as sem_14,
max(case when Semana = 15 then Pesente end) as sem_15,
max(case when Semana = 16 then Pesente end) as sem_16
from
(
Select
id,
datepart(week,fecha) as Semana,
count(*) as Presente
From
TABLA
Where estado='P'
group by
id , datepart(week,fecha)
) as t
group by id;
GO
Como se puede apreciar ahora esta consulta la filtro por estado, pero
en la misma tabla tengo los Ausentes con valor A, entonces
select
id,
max(case when Semana = 14 then Ausente end) as sem_14,
max(case when Semana = 15 then Ausente end) as sem_15,
max(case when Semana = 16 then Ausente end) as sem_16
from
(
Select
id,
datepart(week,fecha) as Semana,
count(*) as Ausente
From
TABLA
Where estado='A'
group by
id , datepart(week,fecha)
) as t
group by id;

Entonces realice un alias de ambas consultas y hago un Select * from A
inner Join B on a.id=b.id y con el resultado hago una operacion
(supongamos sum)

Sería posible hacerlo en un Solo Select ??

Atte.
PENTA.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida