Query por grupos

28/07/2003 - 21:01 por AlejoR | Informe spam
Hola grupo.
Necesito hacer una consulta de la siguiente manera. Tengo los datos de los
ultimos 12 meses y necesito agruparlos en trimestres, ejm: un grupo es (7, 8
,9) otro es (8, 9, 10), otro es (9, 10, 11), y asi sucesivamente, dan 10
grupos y de esos 10 grupos tomar el mayor.

FECHA VALOR
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

(12 filas afectadas)

Se les ocurre alguna manera de realizar ese query
Le quedare muy agradecidos.
Salu3

Preguntas similare

Leer las respuestas

#1 Miguel Egea
28/07/2003 - 21:10 | Informe spam
select top 1 month(fecha)/3, sum(valor) from XX group by month(fecha)/3
order by 2 desc

No he comprobado la sintaxis, pero creo que puede funcionar


Un Saludo
Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.

"AlejoR" escribió en el mensaje
news:
Hola grupo.
Necesito hacer una consulta de la siguiente manera. Tengo los datos de los
ultimos 12 meses y necesito agruparlos en trimestres, ejm: un grupo es (7,


8
,9) otro es (8, 9, 10), otro es (9, 10, 11), y asi sucesivamente, dan 10
grupos y de esos 10 grupos tomar el mayor.

FECHA VALOR
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

(12 filas afectadas)

Se les ocurre alguna manera de realizar ese query
Le quedare muy agradecidos.
Salu3


Respuesta Responder a este mensaje
#2 Javier Loria\(MVP\)
28/07/2003 - 21:51 | Informe spam
Hola Alejo:
Asumo que esta haciendo un PROMEDIO MOVIL. Si no es asi entonces la
sintaxis que sigue no te sirve:
/* Inicio de Codigo */
SELECT T1.Fecha AS AnoInicio,
T1.Mes AS MesInicio, -- Asumiendo que la
Columna se LlamaMes
T3.Fecha AS AnoFinal,
T3.Mes AS MesFinal, -- Asumiendo que la Columna
se LlamaMes
T1.Valor+T2.Valor+T3.Valor AS PromedioMovilTrimestral
FROM Tabla as T1
JOIN Tabla AS T2 ON
(T1.Fecha=T2.Fecha AND T1.Mes+1=T2.Mes) OR
(T1.Fecha+1=T2.Fecha AND T1.Mes AND T2.Mes=1)
JOIN Tabla AS T3 ON
(T2.Fecha=T3.Fecha AND T2.Mes+1=T3.Mes) OR
(T2.Fecha+1=T3.Fecha AND T2.Mes AND T3.Mes=1)
/* Fin de Codigo */

Si no es esto puedes posternos cual seria el resultado deseado, y vemos si
lo ajustamos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
AlejoR wrote:
Hola grupo.
Necesito hacer una consulta de la siguiente manera. Tengo los datos
de los ultimos 12 meses y necesito agruparlos en trimestres, ejm: un
grupo es (7, 8 ,9) otro es (8, 9, 10), otro es (9, 10, 11), y asi
sucesivamente, dan 10 grupos y de esos 10 grupos tomar el mayor.

FECHA VALOR
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

(12 filas afectadas)

Se les ocurre alguna manera de realizar ese query
Le quedare muy agradecidos.
Salu3
Respuesta Responder a este mensaje
#3 AlejoR
30/07/2003 - 15:33 | Informe spam
Hola gracias por las respuestas.
Primero este es el quiery que vota el resultado mencionado. Salidas totales
de los ultimos 12 meses. (En millones)
SELECT YEAR(FECHA) AÑO, MONTH(FECHA) MES,
SUM(VALOR_SALIDAS_BILLETE)/1000000 SALIDAS_TOTALES
FROM SIH_SALIDAS_TOTALES_BILLETE_VERIFICADA
WHERE FECHA >= DATEADD(MONTH, -12, @FECHA) AND FECHA < @FECHA
AND CODIGO_OFICINA = @CODIGO_OFICINA
GROUP BY YEAR(FECHA), MONTH(FECHA)
ORDER BY YEAR(FECHA), MONTH(FECHA)

AÑO MES SALIDAS_TOTALES
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

Al agruparlos en trimestres seria algo asi: G1(7, 8, 9) = (32231 + 21212 +
14888 = 68331), G2(8,9,10) = (21212 + 14888 + 32594 = 68694),
G3(9, 10, 11) = (14888 + 32594 + 43079 = 90561), G4(10, 11, 12) = (32594 +
43079 +76680 = 152353),
G5(11, 12, 1) = (43079 + 76680 + 5764 = 125523), G6 (12, 1, 2) = (76680 +
5764 + 11632 = 94076), G7(1, 2, 3) = (5764 + 11632 + 15609 = 33005),
G8(2, 3, 4) = (11632 + 15609 + 32933 = 60174), G9(3, 4, 5) = (15609 + 32933
+ 26967 = 75509)

y el mayor de todos los resultados es: 152353
Eso seria lo que necesito.
Gracias a todos.

"AlejoR" escribió en el mensaje
news:
Hola grupo.
Necesito hacer una consulta de la siguiente manera. Tengo los datos de los
ultimos 12 meses y necesito agruparlos en trimestres, ejm: un grupo es (7,


8
,9) otro es (8, 9, 10), otro es (9, 10, 11), y asi sucesivamente, dan 10
grupos y de esos 10 grupos tomar el mayor.

FECHA VALOR
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

(12 filas afectadas)

Se les ocurre alguna manera de realizar ese query
Le quedare muy agradecidos.
Salu3


Respuesta Responder a este mensaje
#4 Miguel Egea
30/07/2003 - 17:09 | Informe spam
pues insisto alejo, en que el que te propuse yo creo que funcionaría bien.
Si lo que quieres es el desglose de ese trimestre, puedes usar el resultado
para hacer un subselect.

Saludos
Miguel Egea
http://www.portalsql.com
SQL-Server MVP
"AlejoR" escribió en el mensaje
news:
Hola gracias por las respuestas.
Primero este es el quiery que vota el resultado mencionado. Salidas


totales
de los ultimos 12 meses. (En millones)
SELECT YEAR(FECHA) AÑO, MONTH(FECHA) MES,
SUM(VALOR_SALIDAS_BILLETE)/1000000 SALIDAS_TOTALES
FROM SIH_SALIDAS_TOTALES_BILLETE_VERIFICADA
WHERE FECHA >= DATEADD(MONTH, -12, @FECHA) AND FECHA < @FECHA
AND CODIGO_OFICINA = @CODIGO_OFICINA
GROUP BY YEAR(FECHA), MONTH(FECHA)
ORDER BY YEAR(FECHA), MONTH(FECHA)

AÑO MES SALIDAS_TOTALES
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

Al agruparlos en trimestres seria algo asi: G1(7, 8, 9) = (32231 + 21212 +
14888 = 68331), G2(8,9,10) = (21212 + 14888 + 32594 = 68694),
G3(9, 10, 11) = (14888 + 32594 + 43079 = 90561), G4(10, 11, 12) = (32594 +
43079 +76680 = 152353),
G5(11, 12, 1) = (43079 + 76680 + 5764 = 125523), G6 (12, 1, 2) = (76680 +
5764 + 11632 = 94076), G7(1, 2, 3) = (5764 + 11632 + 15609 = 33005),
G8(2, 3, 4) = (11632 + 15609 + 32933 = 60174), G9(3, 4, 5) = (15609 +


32933
+ 26967 = 75509)

y el mayor de todos los resultados es: 152353
Eso seria lo que necesito.
Gracias a todos.

"AlejoR" escribió en el mensaje
news:
> Hola grupo.
> Necesito hacer una consulta de la siguiente manera. Tengo los datos de


los
> ultimos 12 meses y necesito agruparlos en trimestres, ejm: un grupo es


(7,
8
> ,9) otro es (8, 9, 10), otro es (9, 10, 11), y asi sucesivamente, dan 10
> grupos y de esos 10 grupos tomar el mayor.
>
> FECHA VALOR
> 2002 7 32231.300000
> 2002 8 21212.000000
> 2002 9 14888.801000
> 2002 10 32594.107000
> 2002 11 43079.436000
> 2002 12 76680.909000
> 2003 1 5764.698000
> 2003 2 11632.801000
> 2003 3 15609.500000
> 2003 4 32933.098000
> 2003 5 26967.800000
> 2003 6 14791.150000
>
> (12 filas afectadas)
>
> Se les ocurre alguna manera de realizar ese query
> Le quedare muy agradecidos.
> Salu3
>
>


Respuesta Responder a este mensaje
#5 Javier Loria\(MVP\)
30/07/2003 - 20:58 | Informe spam
Hola Alejo:
Ese Query tuyo se las trae.
El unico cambio que le hice a tu logica es que no separe el ano y el mes
porque si no te quedar unos case medios incomodos, luego a la hora de la
presentacion puedes presentarlos como valores independientes.
Vamos por partes a ver si se entiende el codigo.
a) Obtengamos las ventas mensuales:
SELECT DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha) AS Fecha,
SUM(VALOR_SALIDAS_BILLETE)) AS VentaMensual
FROM Orders
GROUP BY DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha)
ORDER BY DATEADD(mm,DATEDIFF(mm,@Fecha,Fecha),@Fecha)
En lugar de partir la Fecha en mes y ano simplementente calcule la
diferencia en meses con la fecha inicial.

b) Sumemos las ventas "Trimestrales", cuando hablamos de Trimestrales no
usamos Trimestres completos, como la consulta de Miguel, sino que nos
referimos a 3 meses consecutivos. Para esto requerimos que una fila "sume" 3
veces debemos hacer 2 JOIN a la misma consulta 2 veces.
SELECT A1.Fecha,
(A1.VentaMensual+
A2.VentaMensual+
A3.VentaMensual) AS PromedioMovilTrimestral
FROM ( SELECT DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha) AS Fecha,
SUM(VALOR_SALIDAS_BILLETE)) AS VentaMensual
FROM Orders
GROUP BY DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha)
) AS A1
JOIN ( SELECT DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha) AS Fecha,
SUM(VALOR_SALIDAS_BILLETE)) AS VentaMensual
FROM Orders
GROUP BY DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha)
) AS A2
ON DATEDIFF(mm,A1.Fecha,A2.Fecha)=1
JOIN ( SELECT DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha) AS Fecha,
SUM(VALOR_SALIDAS_BILLETE)) AS VentaMensual
FROM Orders
GROUP BY DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha)
) AS A3
ON DATEDIFF(mm,A1.Fecha,A3.Fecha)=2
ORDER BY A1.Fecha

c) Para obtener la MAYOR venta de este promedio debes hacer un TOP 1 y
ordernar por monto descendente.
SELECT TOP 1
A1.Fecha,
(A1.VentaMensual+ A2.VentaMensual+ A3.VentaMensual) AS
PromedioMovilTrimestral
FROM ( SELECT DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha) AS Fecha,
SUM(VALOR_SALIDAS_BILLETE)) AS VentaMensual
FROM Orders
GROUP BY DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha)
) AS A1
JOIN ( SELECT DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha) AS Fecha,
SUM(VALOR_SALIDAS_BILLETE)) AS VentaMensual
FROM Orders
GROUP BY DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha)
) AS A2
ON DATEDIFF(mm,A1.Fecha,A2.Fecha)=1
JOIN ( SELECT DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha) AS Fecha,
SUM(VALOR_SALIDAS_BILLETE)) AS VentaMensual
FROM Orders
GROUP BY DATEADD(mm,DATEDIFF(mm,@Fecha, Fecha),@Fecha)
) AS A3
ON DATEDIFF(mm,A1.Fecha,A3.Fecha)=2
ORDER BY (A1.VentaMensual+ A2.VentaMensual+ A3.VentaMensual) DESC

d) Luego si quieres puedes cambiar el formato de la Fecha para que sean 2
columnas (mes y ano) usaslas funciones YEAR y MONTH como hiciste en tu
consulta y dividiendo por 1000000 para obenter tu query.

Espero haber entedido el problema,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


Hola gracias por las respuestas.
Primero este es el quiery que vota el resultado mencionado. Salidas
totales de los ultimos 12 meses. (En millones)
SELECT YEAR(FECHA) AÑO, MONTH(FECHA) MES,
SUM(VALOR_SALIDAS_BILLETE)/1000000
SALIDAS_TOTALES FROM SIH_SALIDAS_TOTALES_BILLETE_VERIFICADA
WHERE FECHA >= DATEADD(MONTH, -12, @FECHA) AND FECHA < @FECHA
AND CODIGO_OFICINA = @CODIGO_OFICINA
GROUP BY YEAR(FECHA), MONTH(FECHA)
ORDER BY YEAR(FECHA), MONTH(FECHA)

AÑO MES SALIDAS_TOTALES
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

Al agruparlos en trimestres seria algo asi: G1(7, 8, 9) = (32231 +
21212 + 14888 = 68331), G2(8,9,10) = (21212 + 14888 + 32594 = 68694),
G3(9, 10, 11) = (14888 + 32594 + 43079 = 90561), G4(10, 11, 12) > (32594 + 43079 +76680 = 152353),
G5(11, 12, 1) = (43079 + 76680 + 5764 = 125523), G6 (12, 1, 2) > (76680 + 5764 + 11632 = 94076), G7(1, 2, 3) = (5764 + 11632 + 15609 > 33005),
G8(2, 3, 4) = (11632 + 15609 + 32933 = 60174), G9(3, 4, 5) = (15609 +
32933 + 26967 = 75509)

y el mayor de todos los resultados es: 152353
Eso seria lo que necesito.
Gracias a todos.

"AlejoR" escribió en el mensaje
news:
Hola grupo.
Necesito hacer una consulta de la siguiente manera. Tengo los datos
de los ultimos 12 meses y necesito agruparlos en trimestres, ejm: un
grupo es (7,


8
,9) otro es (8, 9, 10), otro es (9, 10, 11), y asi sucesivamente,
dan 10 grupos y de esos 10 grupos tomar el mayor.

FECHA VALOR
2002 7 32231.300000
2002 8 21212.000000
2002 9 14888.801000
2002 10 32594.107000
2002 11 43079.436000
2002 12 76680.909000
2003 1 5764.698000
2003 2 11632.801000
2003 3 15609.500000
2003 4 32933.098000
2003 5 26967.800000
2003 6 14791.150000

(12 filas afectadas)

Se les ocurre alguna manera de realizar ese query
Le quedare muy agradecidos.
Salu3
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida