Agrupar por día de la semana

10/10/2007 - 17:22 por Eclat | Informe spam
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,

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
10/10/2007 - 18:02 | Informe spam
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


"Eclat" wrote:

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,

Respuesta Responder a este mensaje
#2 Eclat
10/10/2007 - 18:55 | Informe spam
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

Alejandro Mesa escribió:
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


"Eclat" wrote:

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,

Respuesta Responder a este mensaje
#3 Eclat
10/10/2007 - 19:22 | Informe spam
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

P.D. Ahora me pongo a mirar lo del PIVOT

Alejandro Mesa escribió:
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


"Eclat" wrote:

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,

Respuesta Responder a este mensaje
#4 Alejandro Mesa
10/10/2007 - 20:07 | Informe spam
Eclat,

Excelente, veo que pudistes adaptar la idea.

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

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

"Eclat" wrote:

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

Alejandro Mesa escribió:
> 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
>
>
> "Eclat" wrote:
>
>> 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,
>>

Respuesta Responder a este mensaje
#5 Eclat
11/10/2007 - 09:35 | Informe spam
Alejandro Mesa escribió:
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
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida