PDA

Ver la Versión Completa : ¿Cómo aplicar un filtro por fecha a un campo calculado dentro de una consulta?


Jean Pierre
02-08-2012, 02:07:57
Saludos amigos foreros, estoy elaborando un reporte con el ReportBuilder de Digital Metaphors al cual le agregue varias consultas de la Base de Datos con el objetivo de obtener los datos y calculos que son necesarios para el reporte en cuestión, una de las consulta (Ver enlace "Imagen Consulta_B") incluye un campo calculado como les muestro a continuación:

SELECT CodProd, AVG(CntVentas)AS Promedio
FROM SAEPRD
GROUP BY CodProd
ORDER BY CodProd DESC

La tabla a la que esta asociada dicha consulta incluye una columna denominada "Periodo" del tipo fecha con formato YYYYMM la cual deseo utilizar para filtrar mi consulta, el problema se presenta debido a que el dato "Periodo" se repite por cada producto que este registrado debido a que la tabla a la que esta asociada es una tabla de estadisticas de inventario (Ver enlace "Imagen Tabla SAEPRD"). Mi objetivo es obtener el promedio de ventas mensual de un producto tomando como base para el calculo la sumatoria de las ventas ( AVG(CntVentas) ) de los ultimos 12 meses (Tabla SAEPRD.Periodo), ya tengo la sumatoria pero no conozco la forma de filtrar la consulta con los ultimos 12 meses, esto ultimo es importante ya que al generar el reporte la consulta debe tomar como ultima fecha la del momento en que se esta generando el reporte y tomar en cuenta los 12 meses anteriores para ejecutar el calculo respectivo.

Trate de explicar mi caso de la mejor manera, si necesitan información adicional para solventar mi duda con gusto se las expondre.

Imagen Consulta_B: https://dl.dropbox.com/u/93589263/Consulta_B.jpg
Imagen Tabla SAEPRD: https://dl.dropbox.com/u/93589263/Tabla%20SAEPRD.jpg
Imagen Reporte: https://dl.dropbox.com/u/93589263/Reporte.jpg

De antemano muchas gracias por la ayuda que puedan brindarme. :)

AzidRain
02-08-2012, 02:33:30
No mencionas que motor usas. Pero por lo regular en un "where" que seria el filtro, no se pueden utilizar funciones, cuando es el caso como me parece que es el tuyo utilizamos la clausula "HAVING" para filtrar los grupos creo que pudiera ser así:


SELECT CodProd, AVG(CntVentas)AS Promedio
FROM SAEPRD
GROUP BY CodProd HAVING AVG(CntVentas)="aqui pones tu condicion"
ORDER BY CodProd DESC


Lo escribo de botepronto aclaro.

Jean Pierre
02-08-2012, 05:02:32
No mencionas que motor usas. Pero por lo regular en un "where" que seria el filtro, no se pueden utilizar funciones, cuando es el caso como me parece que es el tuyo utilizamos la clausula "HAVING" para filtrar los grupos creo que pudiera ser así:


SELECT CodProd, AVG(CntVentas)AS Promedio
FROM SAEPRD
GROUP BY CodProd HAVING AVG(CntVentas)="aqui pones tu condicion"
ORDER BY CodProd DESC


Lo escribo de botepronto aclaro.
Saludos AzidRain, ante todo te agradezco mucho tu aporte y tu interés por mi interrogante, te comento que intente la solución que me planteaste pero no logre que funcionara, esto debido a que la variable que necesito usar como filtro no se encuentra dentro de la selección del comando SELECT, adicional a esto es importante resaltar que la condición debe estar ligada con la fecha en que se genera el reporte ya que necesito que tome como base para el calculo los últimos 12 meses para así obtener un valor mas fiable de la rotación mensual del inventario.

El motor de Base de Datos que utiliza mi sistema es el MS SQL Server Enterprise 2008.

De nuevo muchas gracias por tu ayuda. :)

roman
02-08-2012, 17:59:00
Lo que dificulta tu consulta es el hecho de que el campo periodo no es un campo tipo fecha. Pero pienso que podrías hacer un CAST, agregando el dia 1 de cada mes, para obtener una fecha completa. Claro que posiblemnte tendrás que separar año y mes del periodo y luego concatenar con el dia primero. Una vez que tengas la fecha puedes usar una función para sumar o restar de una fecha. En SQL Server parece que esa función es DateAdd.

Por ejemplo, si el campo periodo fuera de tipo Date, entonces tu filtro sería:


where periodo between GetDate() and DateAdd(year, -1, GetDate())


es decir, que el periodo esté entre la fecha actual (GetDate) y la fecha actual menos un año.

// Saludos

Jean Pierre
28-08-2012, 02:09:37
Saludos amigos foreros, ante todo les remito mi agradecimiento por sus valiosos comentarios de ayuda y asesoramiento, les comento que logre hacer mi reporte con los útiles consejos que me dieron y leyendo un poco sobre SQL Server y Transact-SQL, luego de muchas pruebas y de mucha meditación decidi crear una vista en SQL para luego consultarla en el ReportBuilder, ya que, si generaba las consultas con los calculos requeridos el reporte demoraba toda una eternidad en crearse; el script para la consulta quedo de la siguiente manera:

SELECT TOP (100) PERCENT coditem, SUM(Cantidad) AS TOTALVTA
FROM dbo.VW_ADM_ITEMSFACTURA
WHERE (FechaEF BETWEEN DATEADD(year, - 1, GETDATE()) AND GETDATE())
GROUP BY coditem, TipoFac
HAVING (TipoFac = 'A')
ORDER BY coditem

Como pueden ver con la consulta anterior obtuve el acumulado de venta por producto del ultimo año y luego en el ReportBuilder cree una variable calculada para promediar las ventas. Actualmente el reporte esta en periodo de prueba y le estamos haciendo algunos chequeos para verificar que la informacion plasmada en el mismo sea fidedigna pero gracias a ustedes hemos logrado un gran avance.

Muchisimas gracias . . .