Agrupar por SUM

21/09/2004 - 16:32 por Miguel Tubia | Informe spam
Hola a todos,
tengo una consulta que no sé bien como hacer, a ver si me puede echar una
manita
tengo una tabla que tiene las categorias de trabajadores (tinyint) y las
horas extra que trabajan en segundos (campo presencia, int). Queremos sacar
todas las horas que trabajan en un grupo, para lo que hacemos lo siguiente:

select categoria, sum(presencia)
from marcajes
where datepart(mm, per)=9 and datepart(yy,per) 04 and categoria in (8, 9,
10, 11, 3, 4)
group by categoria

per es el periodo, y lo ponemos solo para este mes, y las categorias
listadas son las que nos interesan.
Ahora bien, queremos que nos salga de la siguiente forma:
* en columnas por categoria
* agrupado por filas de 5 horas de intervalo
Como lo siguiente:

Horas Cat.8 Cat.9 Cat.10 etc...
________________________________
<0

0-5
5-10

.. etc

Y todo exportado a un Excel...
Y no sabemos muy bien como hacerlo. Ya pensamos que por SQL no se puede
hacer y que hay q sacarlo por algún programilla, pero ya queremos aprovechar
y sacar el jugo al sql (somos algo sádicos quizás???).
En fin, si alguien tiene una idea por donde podemos tirar, le estaremos muy
agradecido.
Un saludo y gracias por anticipado

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
21/09/2004 - 17:37 | Informe spam
Hola Miguel,
espero que te sirva, o puedas adaptarlo a tus necesidades:
Saludos, Liliana.


create table #tabla
(categoria tinyint,
presencia int,
per datetime)
insert #tabla select 8, 10, '20040901'
insert #tabla select 8, 20, '20040901'
insert #tabla select 8, 30, '20040901'
insert #tabla select 9, 100, '20040901'
insert #tabla select 9, 200, '20040901'
insert #tabla select 9, 300, '20040901'
insert #tabla select 9, 10, '20040901'

create table #tabla_rangos
(HoraD smallint,
HoraH smallint,
Descripcion char(10))
insert #tabla_rangos select 0, 5, ' 0-05'
insert #tabla_rangos select 6, 10, ' 6-10'
insert #tabla_rangos select 7, 15, '11-15'
insert #tabla_rangos select 16, 20, '16-20'
insert #tabla_rangos select 21, 25, '21-25'


SELECT Horas = Descripcion,
[Categoria 8 ] = SUM(CASE Categoria WHEN 8 THEN minutos ELSE 0 END),
[Categoria 9 ] = SUM(CASE Categoria WHEN 9 THEN minutos ELSE 0 END)
,
[Categoria 10] = SUM(CASE Categoria WHEN 10 THEN minutos ELSE 0 END)
,
[Categoria 11] = SUM(CASE Categoria WHEN 11 THEN minutos ELSE 0 END)
,
[Categoria 3 ] = SUM(CASE Categoria WHEN 3 THEN minutos ELSE 0 END)
,
[Categoria 4 ] = SUM(CASE Categoria WHEN 4 THEN minutos ELSE 0 END)
FROM (
SELECT Categoria,
Minutos = SUM(presencia),
Horas = CASE WHEN SUM(presencia) % 60 > 0 THEN (SUM
(presencia) / 60) + 1 ELSE SUM (presencia) / 60 END
FROM #tabla
WHERE MONTH( per) = 9 AND YEAR( per) = 2004 AND categoria in (8, 9,
10, 11, 3, 4)
GROUP BY categoria) Tiempos
RIGHT JOIN #tabla_rangos on Horas between HoraD and HoraH
GROUP BY Descripcion


"Miguel Tubia" <####m_tubiaARROBAhotmail.com###> escribió en el mensaje
news:#52mTf#
Hola a todos,
tengo una consulta que no sé bien como hacer, a ver si me puede echar una
manita
tengo una tabla que tiene las categorias de trabajadores (tinyint) y las
horas extra que trabajan en segundos (campo presencia, int). Queremos


sacar
todas las horas que trabajan en un grupo, para lo que hacemos lo


siguiente:

select categoria, sum(presencia)
from marcajes
where datepart(mm, per)=9 and datepart(yy,per) 04 and categoria in (8,


9,
10, 11, 3, 4)
group by categoria

per es el periodo, y lo ponemos solo para este mes, y las categorias
listadas son las que nos interesan.
Ahora bien, queremos que nos salga de la siguiente forma:
* en columnas por categoria
* agrupado por filas de 5 horas de intervalo
Como lo siguiente:

Horas Cat.8 Cat.9 Cat.10 etc...
________________________________
<0

0-5
5-10

.. etc

Y todo exportado a un Excel...
Y no sabemos muy bien como hacerlo. Ya pensamos que por SQL no se puede
hacer y que hay q sacarlo por algún programilla, pero ya queremos


aprovechar
y sacar el jugo al sql (somos algo sádicos quizás???).
En fin, si alguien tiene una idea por donde podemos tirar, le estaremos


muy
agradecido.
Un saludo y gracias por anticipado


Respuesta Responder a este mensaje
#2 Tinoco
21/09/2004 - 17:38 | Informe spam
Hola,

Para sacar las categorias como columnas puedes probar con
las Cross-table, para consultas que tienen columnas
variables:
http://www.sqlmag.com/Articles/Index.cfm?ArticleID608

Para exportar el resultado a Excel, puedes utilizar un
DTS, que ejecute la consulta que construyas con el punto
anterior.

El agrupamiento por intervalos de tiempos, no veo como
implementarlo en este momento... Trata con esto y nos
cuentas ...

Hermilson T.
Colombia

Hola a todos,
tengo una consulta que no sé bien como hacer, a ver si


me puede echar una
manita
tengo una tabla que tiene las categorias de trabajadores


(tinyint) y las
horas extra que trabajan en segundos (campo presencia,


int). Queremos sacar
todas las horas que trabajan en un grupo, para lo que


hacemos lo siguiente:

select categoria, sum(presencia)
from marcajes
where datepart(mm, per)=9 and datepart(yy,per) 04 and


categoria in (8, 9,
10, 11, 3, 4)
group by categoria

per es el periodo, y lo ponemos solo para este mes, y


las categorias
listadas son las que nos interesan.
Ahora bien, queremos que nos salga de la siguiente forma:
* en columnas por categoria
* agrupado por filas de 5 horas de intervalo
Como lo siguiente:

Horas Cat.8 Cat.9 Cat.10 etc...
________________________________
<0

0-5
5-10

... etc

Y todo exportado a un Excel...
Y no sabemos muy bien como hacerlo. Ya pensamos que por


SQL no se puede
hacer y que hay q sacarlo por algún programilla, pero ya


queremos aprovechar
y sacar el jugo al sql (somos algo sádicos quizás???).
En fin, si alguien tiene una idea por donde podemos


tirar, le estaremos muy
agradecido.
Un saludo y gracias por anticipado
Respuesta Responder a este mensaje
#3 Miguel Tubia
22/09/2004 - 13:12 | Informe spam
Hola,
gracias a los 2 por sus respuestas, el link de Tinoco me ha resultado muy
interesante ¡gracias!
He estado ojeando la consulta que me paso la compañera Liliana.
por lo visto, me expliqué mal. He vuelto a leer mi pregunta y ciertamente
quizás no me expresé adecuadamente, por lo q pido disculpas. Aún así,
Liliana, tu código se acerca mucho y estoy tratando de adaptarlo.
El caso es que lo que se quiere saber no es el total del grupo, sino cuantos
trabajadores han trabajado esas horas. Poniendo como ejemplo lo mismo q
antes:

Horas Cat.8 Cat.9 Cat.10 etc...
________________________________
<0 > cuantos trabajadores, por categoria, han trabajado menos de 0
horas extras Antes creo q puse el total del grupo 8.. sorry

0-5
5-10

.. etc

Y así con todos. Así que habría q coger el sumatorio de horas de cada uno y
luego agruparlos de alguna forma. Sobre la consulta de Liliana he probado
añadiendo el DNI y agrupandolo:


create table #tabla_rangos
(HoraD smallint,
HoraH smallint,
Descripcion char(13))
insert #tabla_rangos select null, 0, '-0 horas'
insert #tabla_rangos select 0, 5, '0-5 horas'
insert #tabla_rangos select 6, 10, '6-10 horas'
insert #tabla_rangos select 7, 15, '11-15 horas'
insert #tabla_rangos select 16, 20, '16-20 horas'
insert #tabla_rangos select 21, 25, '21-25 horas'
insert #tabla_rangos select 26, 30, '26-30 horas'
insert #tabla_rangos select 31, 35, '31-35 horas'
insert #tabla_rangos select 36, 40, '36-40 horas'
insert #tabla_rangos select 41, 45, '41-45 horas'
insert #tabla_rangos select 46, 50, '46-50 horas'


SELECT Horas = Descripcion,
[Categoria 8 ] = count(CASE Categoria WHEN 8 THEN dni ELSE 0 END)
,
[Categoria 9 ] = Count(CASE Categoria WHEN 9 THEN dni ELSE 0 END)
,
[Categoria 10] = Count(CASE Categoria WHEN 10 THEN dni ELSE 0 END)
,
[Categoria 11] = Count(CASE Categoria WHEN 11 THEN dni ELSE 0 END)
,
[Categoria 3 ] = Count(CASE Categoria WHEN 3 THEN dni ELSE 0 END)
,
[Categoria 4 ] = Count(CASE Categoria WHEN 4 THEN dni ELSE 0 END)
FROM (
SELECT Categoria,
tiempo = SUM(presencia),
dni
FROM marcajes
WHERE MONTH(per) = 8 AND YEAR(per) = 2004 AND categoria in (8, 9,
10, 11, 3, 4)
GROUP BY dni, Categoria) Tiempos
RIGHT JOIN #tabla_rangos on tiempo between HoraD*3600 and HoraH*3600
GROUP BY Descripcion

Pero no me sale, me pone en todas las categorias los mismos valores. Si
alguien pudiera echarme un cable más y de un vistazo ver algo raro, le
agardecería me respondiera para echar un ojo a lo que no cuadre.
Muchas gracias por todo
Un saludo
Respuesta Responder a este mensaje
#4 Liliana Sorrentino
22/09/2004 - 13:56 | Informe spam
Hola Miguel,
Entonces solo sacale el ELSE 0 de los CASE de Categoría, ya que el COUNT te
cuenta también los ceros, yo lo puse en el caso de usar SUM para que no
muestre nulos.
Saludos,
Liliana.

"Miguel Tubia" <####m_tubiaARROBAhotmail.com###> escribió en el mensaje
news:#
Hola,
gracias a los 2 por sus respuestas, el link de Tinoco me ha resultado muy
interesante ¡gracias!
He estado ojeando la consulta que me paso la compañera Liliana.
por lo visto, me expliqué mal. He vuelto a leer mi pregunta y ciertamente
quizás no me expresé adecuadamente, por lo q pido disculpas. Aún así,
Liliana, tu código se acerca mucho y estoy tratando de adaptarlo.
El caso es que lo que se quiere saber no es el total del grupo, sino


cuantos
trabajadores han trabajado esas horas. Poniendo como ejemplo lo mismo q
antes:

Horas Cat.8 Cat.9 Cat.10 etc...
________________________________
<0 > cuantos trabajadores, por categoria, han trabajado menos de 0
horas extras Antes creo q puse el total del grupo 8.. sorry

0-5
5-10

.. etc

Y así con todos. Así que habría q coger el sumatorio de horas de cada uno


y
luego agruparlos de alguna forma. Sobre la consulta de Liliana he probado
añadiendo el DNI y agrupandolo:


create table #tabla_rangos
(HoraD smallint,
HoraH smallint,
Descripcion char(13))
insert #tabla_rangos select null, 0, '-0 horas'
insert #tabla_rangos select 0, 5, '0-5 horas'
insert #tabla_rangos select 6, 10, '6-10 horas'
insert #tabla_rangos select 7, 15, '11-15 horas'
insert #tabla_rangos select 16, 20, '16-20 horas'
insert #tabla_rangos select 21, 25, '21-25 horas'
insert #tabla_rangos select 26, 30, '26-30 horas'
insert #tabla_rangos select 31, 35, '31-35 horas'
insert #tabla_rangos select 36, 40, '36-40 horas'
insert #tabla_rangos select 41, 45, '41-45 horas'
insert #tabla_rangos select 46, 50, '46-50 horas'


SELECT Horas = Descripcion,
[Categoria 8 ] = count(CASE Categoria WHEN 8 THEN dni ELSE 0 END)
,
[Categoria 9 ] = Count(CASE Categoria WHEN 9 THEN dni ELSE 0 END)
,
[Categoria 10] = Count(CASE Categoria WHEN 10 THEN dni ELSE 0 END)
,
[Categoria 11] = Count(CASE Categoria WHEN 11 THEN dni ELSE 0 END)
,
[Categoria 3 ] = Count(CASE Categoria WHEN 3 THEN dni ELSE 0 END)
,
[Categoria 4 ] = Count(CASE Categoria WHEN 4 THEN dni ELSE 0 END)
FROM (
SELECT Categoria,
tiempo = SUM(presencia),
dni
FROM marcajes
WHERE MONTH(per) = 8 AND YEAR(per) = 2004 AND categoria in (8, 9,
10, 11, 3, 4)
GROUP BY dni, Categoria) Tiempos
RIGHT JOIN #tabla_rangos on tiempo between HoraD*3600 and HoraH*3600
GROUP BY Descripcion

Pero no me sale, me pone en todas las categorias los mismos valores. Si
alguien pudiera echarme un cable más y de un vistazo ver algo raro, le
agardecería me respondiera para echar un ojo a lo que no cuadre.
Muchas gracias por todo
Un saludo


Respuesta Responder a este mensaje
#5 Miguel Tubia
22/09/2004 - 14:20 | Informe spam
Es verdad! ni me habia dado cuenta... volviendome loco y era eso
Muchas gracias por todo, os debo una ;)
Un saludo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida