Discussion:
Agrupar por día de la semana
(demasiado antiguo para responder)
Eclat
2007-10-10 15:22:25 UTC
Permalink
Muy buenas tardes de nuevo, a ver si me podéis orientar sobre si es
posible hacer en una consulta algo así, y cual sería para ello la forma
más óptima.

Tengo una tabla con id, fecha, origen, destino y me gustaría obtener una
consulta para saber para cuantas veces se repite un origen/destino un
determinado día de la semana. Umm, no sé si me explicaré bien, el
resultado que quiero obtener es el siguiente:

Ruta, lunes, martes, miércoles, jueves, viernes, sábado, domingo
Madrid/Barcelona, 3,2,5,6,3,1,0

Es decir, la ruta Madrid/Barcelona los lunes (entre unas determinadas
fechas) he hecho 3 viajes, los martes 2, los miércoles 5, los jueves...

He estado mirando el comando DatePart(w,Fecha) y con esto obtengo el día
de la semana (para mí el 1 es el lunes).

SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana

Esta sentencia me devolvería una fila por cada combinación de día de la
semana y no es lo que quiero, querría en una sola fila todos esos datos.
¿Tendré que hacerlo con subconsultas dentro del SELECT?

Admito sugerencias, muchas gracias,
--Eclat
Alejandro Mesa
2007-10-10 16:02:05 UTC
Permalink
Eclat,

Has un PIVOT del resultado.

select
origen,
destino,
sum(case when dia_semana = 'Lunes' then 1 else 0) as Lunes,
...
sum(case when dia_semana = 'Domingo' then 1 else 0) as Domingo,
(
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
) as t
group by
origen, destino
go


AMB
Post by Eclat
Muy buenas tardes de nuevo, a ver si me podéis orientar sobre si es
posible hacer en una consulta algo así, y cual sería para ello la forma
más óptima.
Tengo una tabla con id, fecha, origen, destino y me gustaría obtener una
consulta para saber para cuantas veces se repite un origen/destino un
determinado día de la semana. Umm, no sé si me explicaré bien, el
Ruta, lunes, martes, miércoles, jueves, viernes, sábado, domingo
Madrid/Barcelona, 3,2,5,6,3,1,0
Es decir, la ruta Madrid/Barcelona los lunes (entre unas determinadas
fechas) he hecho 3 viajes, los martes 2, los miércoles 5, los jueves...
He estado mirando el comando DatePart(w,Fecha) y con esto obtengo el día
de la semana (para mí el 1 es el lunes).
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
Esta sentencia me devolvería una fila por cada combinación de día de la
semana y no es lo que quiero, querría en una sola fila todos esos datos.
¿Tendré que hacerlo con subconsultas dentro del SELECT?
Admito sugerencias, muchas gracias,
--Eclat
Eclat
2007-10-10 16:55:34 UTC
Permalink
Muy buenas Alejandro, antes de nada mil gracias por la respuesta y la
rapidez. ¿Si no es mucho preguntar, podrías explicarme un par de cosas
sobre el funcionamiento de este PIVOT? (ya estoy buscando info sobre su
uso).

El caso es que haces un primer SELECT, pero... ¿de que tabla? no veo
ningún FROM para ese SELECT, ¿sería un FROM t después del as t?, por
otro lado, ¿tendría que ponerle un Count(*) en el segundo SELECT para
contar el número de viajes por combinación origen, destino, dia_semana,
o por el contrario sobra el GROUP BY del segundo SELECT?

Voy a ir probando mientras me contestas si tienes un momento. Muchas
gracias.

Salu2
--Eclat
Post by Alejandro Mesa
Eclat,
Has un PIVOT del resultado.
select
origen,
destino,
sum(case when dia_semana = 'Lunes' then 1 else 0) as Lunes,
...
sum(case when dia_semana = 'Domingo' then 1 else 0) as Domingo,
(
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
) as t
group by
origen, destino
go
AMB
Post by Eclat
Muy buenas tardes de nuevo, a ver si me podéis orientar sobre si es
posible hacer en una consulta algo así, y cual sería para ello la forma
más óptima.
Tengo una tabla con id, fecha, origen, destino y me gustaría obtener una
consulta para saber para cuantas veces se repite un origen/destino un
determinado día de la semana. Umm, no sé si me explicaré bien, el
Ruta, lunes, martes, miércoles, jueves, viernes, sábado, domingo
Madrid/Barcelona, 3,2,5,6,3,1,0
Es decir, la ruta Madrid/Barcelona los lunes (entre unas determinadas
fechas) he hecho 3 viajes, los martes 2, los miércoles 5, los jueves...
He estado mirando el comando DatePart(w,Fecha) y con esto obtengo el día
de la semana (para mí el 1 es el lunes).
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
Esta sentencia me devolvería una fila por cada combinación de día de la
semana y no es lo que quiero, querría en una sola fila todos esos datos.
¿Tendré que hacerlo con subconsultas dentro del SELECT?
Admito sugerencias, muchas gracias,
--Eclat
Alejandro Mesa
2007-10-10 18:07:01 UTC
Permalink
Eclat,

Excelente, veo que pudistes adaptar la idea.
Post by Eclat
El caso es que haces un primer SELECT, pero... ¿de que tabla? no veo
ningún FROM para ese SELECT, ¿sería un FROM t después del as t?,
Si, se me paso poner la clausula FROM
Post by Eclat
otro lado, ¿tendría que ponerle un Count(*) en el segundo SELECT para
contar el número de viajes por combinación origen, destino, dia_semana,
o por el contrario sobra el GROUP BY del segundo SELECT?
Sumar 1 si la condicion existe o cero si no existe, es equivalente a contar,
no?

En realidad solo escribi la sugerencia de carretilla, sin probarla. Esto
suelo hacerlo cuando no se postea la estructura de las tablas y data de
ejemplo, pues cuesta tiempo reproducir tal ambiente y aca (y de seguro por
alla tambien) el tiempo es oro.

AMB
Post by Eclat
Muy buenas Alejandro, antes de nada mil gracias por la respuesta y la
rapidez. ¿Si no es mucho preguntar, podrías explicarme un par de cosas
sobre el funcionamiento de este PIVOT? (ya estoy buscando info sobre su
uso).
El caso es que haces un primer SELECT, pero... ¿de que tabla? no veo
ningún FROM para ese SELECT, ¿sería un FROM t después del as t?, por
otro lado, ¿tendría que ponerle un Count(*) en el segundo SELECT para
contar el número de viajes por combinación origen, destino, dia_semana,
o por el contrario sobra el GROUP BY del segundo SELECT?
Voy a ir probando mientras me contestas si tienes un momento. Muchas
gracias.
Salu2
--Eclat
Post by Alejandro Mesa
Eclat,
Has un PIVOT del resultado.
select
origen,
destino,
sum(case when dia_semana = 'Lunes' then 1 else 0) as Lunes,
...
sum(case when dia_semana = 'Domingo' then 1 else 0) as Domingo,
(
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
) as t
group by
origen, destino
go
AMB
Post by Eclat
Muy buenas tardes de nuevo, a ver si me podéis orientar sobre si es
posible hacer en una consulta algo así, y cual sería para ello la forma
más óptima.
Tengo una tabla con id, fecha, origen, destino y me gustaría obtener una
consulta para saber para cuantas veces se repite un origen/destino un
determinado día de la semana. Umm, no sé si me explicaré bien, el
Ruta, lunes, martes, miércoles, jueves, viernes, sábado, domingo
Madrid/Barcelona, 3,2,5,6,3,1,0
Es decir, la ruta Madrid/Barcelona los lunes (entre unas determinadas
fechas) he hecho 3 viajes, los martes 2, los miércoles 5, los jueves...
He estado mirando el comando DatePart(w,Fecha) y con esto obtengo el día
de la semana (para mí el 1 es el lunes).
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
Esta sentencia me devolvería una fila por cada combinación de día de la
semana y no es lo que quiero, querría en una sola fila todos esos datos.
¿Tendré que hacerlo con subconsultas dentro del SELECT?
Admito sugerencias, muchas gracias,
--Eclat
Eclat
2007-10-11 07:35:30 UTC
Permalink
Post by Alejandro Mesa
Eclat,
Excelente, veo que pudistes adaptar la idea.
En realidad solo escribi la sugerencia de carretilla, sin probarla. Esto
suelo hacerlo cuando no se postea la estructura de las tablas y data de
ejemplo, pues cuesta tiempo reproducir tal ambiente y aca (y de seguro por
alla tambien) el tiempo es oro.
Y tanto, pero la idea me ha ayudado muchísimo. Gracias por la ayuda, a
veces una pequeña orientación te abre los ojos, estaba obcecado :D

Salu2
--Eclat

Eclat
2007-10-10 17:22:30 UTC
Permalink
Listo, solucionado, me ha servido de mucho la orientación, he hecho lo
siguiente:

SELECT Cliente, Origen, Destino,
sum(case when datepart(dw,Fecha)=1 then 1 else 0 end) as Lunes,
sum(case when datepart(dw,Fecha)=2 then 1 else 0 end) as Martes,
sum(case when datepart(dw,Fecha)=3 then 1 else 0 end) as Miercoles,
sum(case when datepart(dw,Fecha)=4 then 1 else 0 end) as Jueves,
sum(case when datepart(dw,Fecha)=5 then 1 else 0 end) as Viernes,
sum(case when datepart(dw,Fecha)=6 then 1 else 0 end) as Sabado,
sum(case when datepart(dw,Fecha)=7 then 1 else 0 end) as Domingo
FROM Viajes WITH (nolock)
WHERE Fecha between '01/10/07' and '05/10/07'
GROUP BY Cliente, Origen, Destino

Lo dicho, mil gracias.

Salu2
--Eclat

P.D. Ahora me pongo a mirar lo del PIVOT
Post by Alejandro Mesa
Eclat,
Has un PIVOT del resultado.
select
origen,
destino,
sum(case when dia_semana = 'Lunes' then 1 else 0) as Lunes,
...
sum(case when dia_semana = 'Domingo' then 1 else 0) as Domingo,
(
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
) as t
group by
origen, destino
go
AMB
Post by Eclat
Muy buenas tardes de nuevo, a ver si me podéis orientar sobre si es
posible hacer en una consulta algo así, y cual sería para ello la forma
más óptima.
Tengo una tabla con id, fecha, origen, destino y me gustaría obtener una
consulta para saber para cuantas veces se repite un origen/destino un
determinado día de la semana. Umm, no sé si me explicaré bien, el
Ruta, lunes, martes, miércoles, jueves, viernes, sábado, domingo
Madrid/Barcelona, 3,2,5,6,3,1,0
Es decir, la ruta Madrid/Barcelona los lunes (entre unas determinadas
fechas) he hecho 3 viajes, los martes 2, los miércoles 5, los jueves...
He estado mirando el comando DatePart(w,Fecha) y con esto obtengo el día
de la semana (para mí el 1 es el lunes).
SELECT origen, destino, datepart(w,fecha) as Dia_Semana
FROM viajes
WHERE fecha between fecha1 and fecha2
GROUP BY origen, destino, Dia_Semana
Esta sentencia me devolvería una fila por cada combinación de día de la
semana y no es lo que quiero, querría en una sola fila todos esos datos.
¿Tendré que hacerlo con subconsultas dentro del SELECT?
Admito sugerencias, muchas gracias,
--Eclat
Loading...