SQL - Consulta SQL agrupacion mensual

   
Vista:

Consulta SQL agrupacion mensual

Publicado por RAYMOND (5 intervenciones) el 08/08/2011 22:56:15
Saludos,

Estoy creando un consulta en la cual tengo unos departamentos que traen un importe mensual, dicho importe debe ser presentado por año y mes. Se deben presentar todos los departamentos con su monto Year to Date al mes para cada mes. El problema radica en que cuando un departamento no tiene movimiento en uno de los meses, no trae el departamento con el importe que deberia tener acumulado hasta ese mes, aun si no se vio afectado.

La consulta hasta ahora es la sigte:

Tengo 4 departamentos:
dep1, dep2, dep3, dep4

Select año, mes, departamento, sum(importe)
from table
group by año, mes, departamento

Incluso si tomo los departamentos individualmente y luego realizo un left join a la table con los importes, no me funciona como necesito.



Alguna recomendacion??
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Consulta SQL agrupacion mensual

Publicado por leonardo_josue (878 intervenciones) el 09/08/2011 16:21:18
Hola RAYMOND:

El problema es bastante típico y ocurre porque la BD sólo muestra la información que poseé, es decir es un contenedor de información, no tiene la capacidad de "crear" información si esta no existe. Una solución sería crear una tabla de meses y años, ya sea temporal o física, y puedas hacer entonces un LEFT JOIN, sería más o menos así:

Supongamos que tienes una tabla departamentos tiene la siguiente información

1
2
3
4
5
6
7
8
9
mysql> select * from departamentos;
+------+------+--------------+---------+
| anio | mes  | departamento | importe |
+------+------+--------------+---------+
| 2011 |    1 | uno          |      10 |
| 2011 |    2 | uno          |      20 |
| 2011 |    4 | uno          |      30 |
+------+------+--------------+---------+
3 rows in set (0.03 sec)


Aquí se observa que no hay importe para el mes de marzo (3), una opción sería hacer lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
mysql> create table anios_meses (anio int, mes int);
Query OK, 0 rows affected (0.11 sec)
 
mysql> insert into anios_meses values (2011, 1), (2011, 2), (2011, 3),
   ->(2011, 4), (2011, 5);
Query OK, 5 rows affected (0.05 sec)
Records: 5  Duplicates: 0  Warnings: 0
 
mysql> select * from anios_meses;
+------+------+
| anio | mes  |
+------+------+
| 2011 |    1 |
| 2011 |    2 |
| 2011 |    3 |
| 2011 |    4 |
| 2011 |    5 |
+------+------+
5 rows in set (0.00 sec)
 
mysql> SELECT a.*, IFNULL(d.importe, 0) importe
    -> FROM anios_meses a
    -> LEFT JOIN departamentos d ON a.anio = d.anio AND a.mes = d.mes;
+------+------+---------+
| anio | mes  | importe |
+------+------+---------+
| 2011 |    1 |      10 |
| 2011 |    2 |      20 |
| 2011 |    3 |       0 |
| 2011 |    4 |      30 |
| 2011 |    5 |       0 |
+------+------+---------+
5 rows in set (0.00 sec)


Observa que ahora si aparecen todos los meses (la tabla debería tener los 12 meses del año, solo puse 5 para el ejemplo) al hacer un LEFT JOIN. La función IFNULL se utiliza para poner un cero en los meses en que no tenga importe.

No sé si esto te pueda servir, dale un vistazo y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta SQL agrupacion mensual

Publicado por Raymond (5 intervenciones) el 09/08/2011 19:39:26
Muchas gracias,

Voy a probar y les comento.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta SQL agrupacion mensual

Publicado por Raymond (5 intervenciones) el 09/08/2011 20:30:15
No solo necesito presentar el importe, necesito que se presente el departamento y el importe year to date en el mes indicado, aunque no este afectado en ese mes.

La consulta que llevo hasta ahora es la siguiente y esta hecha en SQL Server, por lo cual utilizaria ISNULL y no IFNULL como en mySQL.

WITH DIVISION AS (

select 'A62310100' AS COD_CUENTA_CONTABLE, '33221' AS COD_DEPARTAMENTO, 'MUESTRAS' AS COD_DIVISION
UNION
select 'A62310701' AS COD_CUENTA_CONTABLE, '33221' AS COD_DEPARTAMENTO, 'MUESTRAS' AS COD_DIVISION
UNION
select 'A66920300' AS COD_CUENTA_CONTABLE, '33221' AS COD_DEPARTAMENTO, 'MUESTRAS' AS COD_DIVISION
UNION
select 'A62220340' AS COD_CUENTA_CONTABLE, '33220' AS COD_DEPARTAMENTO, 'BROCHURES' AS COD_DIVISION

), SALDO AS (

SELECT DISTINCT YEAR(FEC_PROCESO) AS AÑO, MONTH(FEC_PROCESO) AS MES,
COD_CENTRO_DE_BENEFICIO, COD_CUENTA_CONTABLE,
SUM(SALDO_FINAL) AS IMPORTE

FROM FACT_CONTABLE_DETALLE FC
INNER JOIN DIM_REL_DEPARTAMENTO_CECO DR ON FC.COD_CENTRO_COSTO = DR.COD_CENTRO_COSTO
WHERE FEC_PROCESO BETWEEN '2011-01-01' AND GETDATE()
GROUP BY YEAR(FEC_PROCESO), MONTH(FEC_PROCESO), COD_CENTRO_DE_BENEFICIO, COD_CUENTA_CONTABLE

), CENTRO AS (

SELECT AÑO, MES,
S.COD_CENTRO_DE_BENEFICIO, D.COD_DEPARTAMENTO, D.COD_CUENTA_CONTABLE, S.IMPORTE
FROM DIVISION D
INNER JOIN SALDO S ON D.COD_CUENTA_CONTABLE = S.COD_CUENTA_CONTABLE

)

SELECT AÑO, MES, DC.COD_CENTRO_DE_BENEFICIO,
CENTRO.COD_DEPARTAMENTO, SUM(IMPORTE) AS IMPORTE_YTD
FROM CENTRO
INNER JOIN DIM_CENTRO_BENEFICIO DC ON DC.COD_CENTRO_DE_BENEFICIO = CENTRO.COD_CENTRO_DE_BENEFICIO
LEFT JOIN DIM_DEPARTAMENTO DD ON DD.COD_DEPARTAMENTO = CENTRO.COD_DEPARTAMENTO
GROUP BY AÑO, MES, DC.COD_CENTRO_DE_BENEFICIO, CENTRO.COD_DEPARTAMENTO


Hasta ahora me trae todos los centro beneficio y departamentos con sus importe year to date, pero solo si fueron afectados en cada mes. Lo necesito todos.

Espero me puedan ayudar.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta SQL agrupacion mensual

Publicado por leonardo_josue (878 intervenciones) el 10/08/2011 15:58:53
Hola de nuevo Raymond :

De nada nos sirve todo el código que pegaste en el post, pues no podemos ejecutarnos y sinceramente resulta casi imposible de entender al no conocer tu modelo de base de datos.

¿Intentaste aplicar la solución que te coloqué?

La consulta que puse yo era solo un ejemplo de cómo sería, yo no sé si necesitas solo el importe o 10 campos más, el resultado es el mismo. Si tu problema está ocasionado por la falta de información para un mes en específico la solución que te puse te puede ayudar.

De cualquier manera si continuas con el problema ojalá que algún otro forista pueda ayudarte.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta SQL agrupacion mensual

Publicado por Raymond (5 intervenciones) el 10/08/2011 17:36:01
Ya lo he resuelto.

Me fue de gran ayuda tu respuesta.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar