Rango de horas y columna de group by

02/10/2007 - 05:11 por Martín | Informe spam
Hola,
preciso lo siguiente y no se me ocurre una solución eficaz para hacerlo:

tengo una tabla <Ventas>donde tiene:

-Un identificador: IdVenta
-un campo que booleano que indica SI si existío la venta, y NO si no la
existio: ExisteVenta
-un campo con la fecha de la gestiíon de la venta/no venta

y preciso hacer una consulta donde me ponga todas las horas, y a su lado la
cantidad de ventas en esa hora, es decir:

0:00 1
1:00 5
2:00 6
..
...
...
...
24:00 5

es decir que me devuelva en una columna desde 0:00 hrs hasta 24:00 hrs, y en
su columna del mimo registro la suma de los "SI" a existe venta

agluna idea?, sin usar una tabla, sólo con un select..

agradezco cualquier comentario

Martín

Preguntas similare

Leer las respuestas

#1 Salvador Ramos
02/10/2007 - 09:28 | Informe spam
Hola,

Puedes hacer
group by convert(varchar(13), FechaVenta, 120)

Prueba esto y entenderás mejor la agrupación:
print convert(varchar(20), getdate(), 120)
print convert(varchar(13), getdate(), 120)

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Martín" escribió en el mensaje
news:%
Hola,
preciso lo siguiente y no se me ocurre una solución eficaz para hacerlo:

tengo una tabla <Ventas>donde tiene:

-Un identificador: IdVenta
-un campo que booleano que indica SI si existío la venta, y NO si no la
existio: ExisteVenta
-un campo con la fecha de la gestiíon de la venta/no venta

y preciso hacer una consulta donde me ponga todas las horas, y a su lado
la cantidad de ventas en esa hora, es decir:

0:00 1
1:00 5
2:00 6
..
...
...
...
24:00 5

es decir que me devuelva en una columna desde 0:00 hrs hasta 24:00 hrs, y
en su columna del mimo registro la suma de los "SI" a existe venta

agluna idea?, sin usar una tabla, sólo con un select..

agradezco cualquier comentario

Martín

Respuesta Responder a este mensaje
#2 Martín
02/10/2007 - 14:46 | Informe spam
pero en dicho caso me aparecerán sólo los rangos de fecha que tienen una
venta,


yo lo que quiero es que me aparezca del 0:00 a 24:00, si hay un 0 de ninguna
venta en la otra columna también debe aparecer...

de todas maneras gracias por el aporte.


"Salvador Ramos" escribió en el
mensaje news:
Hola,

Puedes hacer
group by convert(varchar(13), FechaVenta, 120)

Prueba esto y entenderás mejor la agrupación:
print convert(varchar(20), getdate(), 120)
print convert(varchar(13), getdate(), 120)

Un saludo
Salvador Ramos

www.helpdna.net (información sobre SQL Server y Microsoft .Net)
www.helpdna.net/acerca_de_salvador_ramos.htm


"Martín" escribió en el mensaje
news:%
Hola,
preciso lo siguiente y no se me ocurre una solución eficaz para hacerlo:

tengo una tabla <Ventas>donde tiene:

-Un identificador: IdVenta
-un campo que booleano que indica SI si existío la venta, y NO si no la
existio: ExisteVenta
-un campo con la fecha de la gestiíon de la venta/no venta

y preciso hacer una consulta donde me ponga todas las horas, y a su lado
la cantidad de ventas en esa hora, es decir:

0:00 1
1:00 5
2:00 6
..
...
...
...
24:00 5

es decir que me devuelva en una columna desde 0:00 hrs hasta 24:00 hrs, y
en su columna del mimo registro la suma de los "SI" a existe venta

agluna idea?, sin usar una tabla, sólo con un select..

agradezco cualquier comentario

Martín





Respuesta Responder a este mensaje
#3 Alejandro Mesa
02/10/2007 - 17:17 | Informe spam
Martín,

Para este tipo de preguntas / problemas, se recomienda se postee la
estructura de las tablas, incluyendo restricciones e indices, asi como data
de ejemplo en forma de sentencias "insert" y el resultado esperado. No es
justo mal gastar nuestro tiempo tratando de simular el ambiente de quien
postea el problema. La ayuda debe ser mutua, no crees?

Puedes usar una variable tipo tabla, tabla temporal o permanente como tabla
auxiliar de numeros. si usas SS 2005, tambien puedes crear esta tabla en el
aire o al vuelo.

;with
L0 as (select 1 as n union all select 1 as n),
L1 as (select 1 as n from L0 as a cross join L0 as b),
L2 as (select 1 as n from L1 as a cross join L1 as b),
L3 as (select 1 as n from L2 as a cross join L2 as b),
Number as (select row_number() over(order by n) AS Number from L3)
SELECT
n.Number - 1 AS hora,
SUM(case when oh.ExisteVenta = 'SI' then 1 else 0 end) AS cnt
FROM
Ventas AS oh RIGHT OUTER JOIN Number AS n
ON oh.OrderDate >= DATEADD(hour, n.Number - 1, CONVERT(CHAR(10),
oh.OrderDate, 126))
AND oh.OrderDate < DATEADD(hour, n.Number, CONVERT(CHAR(10), oh.OrderDate,
126))
WHERE
n.Number <= 24
GROUP BY
n.Number - 1
ORDER BY
n.Number - 1
go


AMB

"Martín" wrote:

Hola,
preciso lo siguiente y no se me ocurre una solución eficaz para hacerlo:

tengo una tabla <Ventas>donde tiene:

-Un identificador: IdVenta
-un campo que booleano que indica SI si existío la venta, y NO si no la
existio: ExisteVenta
-un campo con la fecha de la gestiíon de la venta/no venta

y preciso hacer una consulta donde me ponga todas las horas, y a su lado la
cantidad de ventas en esa hora, es decir:

0:00 1
1:00 5
2:00 6
...



24:00 5

es decir que me devuelva en una columna desde 0:00 hrs hasta 24:00 hrs, y en
su columna del mimo registro la suma de los "SI" a existe venta

agluna idea?, sin usar una tabla, sólo con un select..

agradezco cualquier comentario

Martín



Respuesta Responder a este mensaje
#4 Martín
03/10/2007 - 05:36 | Informe spam
gracias valor, si no me costaba nada meter los inserts, nunca se me pasó por
la cabeza que sería más útil si describía el MER, pero bueno, lo tomaré en
cuenta para una próxima pregunta

"Alejandro Mesa" escribió en el
mensaje news:
Martín,

Para este tipo de preguntas / problemas, se recomienda se postee la
estructura de las tablas, incluyendo restricciones e indices, asi como
data
de ejemplo en forma de sentencias "insert" y el resultado esperado. No es
justo mal gastar nuestro tiempo tratando de simular el ambiente de quien
postea el problema. La ayuda debe ser mutua, no crees?

Puedes usar una variable tipo tabla, tabla temporal o permanente como
tabla
auxiliar de numeros. si usas SS 2005, tambien puedes crear esta tabla en
el
aire o al vuelo.

;with
L0 as (select 1 as n union all select 1 as n),
L1 as (select 1 as n from L0 as a cross join L0 as b),
L2 as (select 1 as n from L1 as a cross join L1 as b),
L3 as (select 1 as n from L2 as a cross join L2 as b),
Number as (select row_number() over(order by n) AS Number from L3)
SELECT
n.Number - 1 AS hora,
SUM(case when oh.ExisteVenta = 'SI' then 1 else 0 end) AS cnt
FROM
Ventas AS oh RIGHT OUTER JOIN Number AS n
ON oh.OrderDate >= DATEADD(hour, n.Number - 1, CONVERT(CHAR(10),
oh.OrderDate, 126))
AND oh.OrderDate < DATEADD(hour, n.Number, CONVERT(CHAR(10), oh.OrderDate,
126))
WHERE
n.Number <= 24
GROUP BY
n.Number - 1
ORDER BY
n.Number - 1
go


AMB

"Martín" wrote:

Hola,
preciso lo siguiente y no se me ocurre una solución eficaz para hacerlo:

tengo una tabla <Ventas>donde tiene:

-Un identificador: IdVenta
-un campo que booleano que indica SI si existío la venta, y NO si no la
existio: ExisteVenta
-un campo con la fecha de la gestiíon de la venta/no venta

y preciso hacer una consulta donde me ponga todas las horas, y a su lado
la
cantidad de ventas en esa hora, es decir:

0:00 1
1:00 5
2:00 6
...



24:00 5

es decir que me devuelva en una columna desde 0:00 hrs hasta 24:00 hrs, y
en
su columna del mimo registro la suma de los "SI" a existe venta

agluna idea?, sin usar una tabla, sólo con un select..

agradezco cualquier comentario

Martín



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