Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Fallo de funcion DATEADD

Estas en el tema de Fallo de funcion DATEADD en el foro de SQL Server en Foros del Web. Hola: Tengo una consulta en SQL server y no se que es lo que falla. Intento sacar la cantidad diferencial entre las ventas de un ...
  #1 (permalink)  
Antiguo 22/07/2015, 06:30
 
Fecha de Ingreso: julio-2015
Ubicación: Barcelona
Mensajes: 4
Antigüedad: 8 años, 9 meses
Puntos: 0
Fallo de funcion DATEADD

Hola:

Tengo una consulta en SQL server y no se que es lo que falla. Intento sacar la cantidad diferencial entre las ventas de un mes y el anterior. Al principio usaba el comparador de meses con la funcion Month(fecha)-1, pero esto no vale cuando quieres comparar Enero con Diciembre del año anterior, asi que pase a usar DATEADD para sacar el mes y año del mes anterior, pero me da error:
Código SQL:
Ver original
  1. SELECT a.punvenid, YEAR(a.fecha) AS Año, MONTH(a.fecha) AS Mes, COUNT(a.ingbru) AS NumRegs,
  2. SUM(a.ingbru) AS SumIng, Avg(a.ingbru) AS PromIng, SUM([a].[ingbru])-(SELECT SUM(b.ingbru)
  3.  FROM ingdet b WHERE YEAR(b.fecha)=YEAR(DATEADD("m",-1,a.fecha)) AND
  4. MONTH(b.fecha)=MONTH(DATEADD("m",-1,a.fecha)) AND b.punvenid=a.punvenid) AS difant
  5. FROM ingdet AS a
  6. GROUP BY a.punvenid, YEAR(a.fecha), MONTH(a.fecha)
  7. ORDER BY a.punvenid, YEAR(a.fecha) DESC , MONTH(a.fecha) DESC;

Me da el tipico error: "Ha intentado ejecutar una consulta que no incluye la expresion especificada 'fecha' como parte de una funcion de agregado"

Si podeis ayudarme os lo agradezco. ESOY
  #2 (permalink)  
Antiguo 22/07/2015, 06:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Fallo de funcion DATEADD

Cita:
Me da el tipico error: "Ha intentado ejecutar una consulta que no incluye la expresion especificada 'fecha' como parte de una funcion de agregado"
Excepto en MySQL, todos los DBMS exigen que todas y cada una de las columnas indicadas en el SELECT, que no estén afectadas por el uso de funciones agregadas, se encuentren listadas en el GROUP BY.
El problema que le veo a tu sentencia:
Código SQL:
Ver original
  1. SELECT
  2.     a.punvenid,
  3.     YEAR(a.fecha) AS Año,
  4.     MONTH(a.fecha) AS Mes,
  5.     COUNT(a.ingbru) AS NumRegs,
  6.     SUM(a.ingbru) AS SumIng,
  7.     Avg(a.ingbru) AS PromIng,
  8.     SUM(a.ingbru)-
  9.                 (SELECT SUM(b.ingbru)
  10.                 FROM ingdet b
  11.                 WHERE YEAR(b.fecha)= YEAR(DATEADD("m",-1,a.fecha))
  12.                     AND MONTH(b.fecha)= MONTH(DATEADD("m",-1,a.fecha))
  13.                     AND b.punvenid=a.punvenid
  14.                 ) AS difant
  15. FROM ingdet AS a
  16. GROUP BY a.punvenid, YEAR(a.fecha), MONTH(a.fecha)
  17. ORDER BY a.punvenid, YEAR(a.fecha) DESC , MONTH(a.fecha) DESC;

Es esta parte, que no es una función de agregación:

Código SQL:
Ver original
  1. (SELECT SUM(b.ingbru)
  2. FROM ingdet b
  3. WHERE YEAR(b.fecha)= YEAR(DATEADD("m",-1,a.fecha))
  4.                     AND MONTH(b.fecha)= MONTH(DATEADD("m",-1,a.fecha))
  5.                     AND b.punvenid=a.punvenid
  6. ) AS difant
La función de agregación es interna, pero a los efectos del SELECT principal, no es una columna agrupada.

Me parece que toda la lógica de tu consulta debe ser replanteada. Así como la intentas hacer no va a funcionar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/07/2015, 06:49
 
Fecha de Ingreso: julio-2015
Ubicación: Barcelona
Mensajes: 4
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Fallo de funcion DATEADD

Hola. Gracias por tu rapida respuesta.

Si cambio la funcion DATEADD por MONTH si que funciona, pero no se porque esta diferencia:

Código SQL:
Ver original
  1. SUM(a.ingbru)-
  2.                 (SELECT SUM(b.ingbru)
  3.                 FROM ingdet b
  4.                 WHERE YEAR(b.fecha)= YEAR(a.fecha)
  5.                     AND MONTH(b.fecha)= MONTH(a.fecha)-1
  6.                     AND b.punvenid=a.punvenid
  7.                 ) AS difant
Este es el codigo anterior, pero este claro esta, no puede calcular la diferencia entre los meses de Enero y Diciembre. Por que el cambio de Month a Dateadd supone el fallo en la consulta??

Mi intencion en conseguir la diferencia entre los ingresos de un mes y su anterior.

Año | Mes | Ingresos | Diferencia
2015 3 1500 100
2015 2 1400 70
2015 1 1330 -300
2014 12 1630

Espero haberme explicado.
Gracias por tu colaboracion.

Última edición por gnzsoloyo; 22/07/2015 a las 07:17
  #4 (permalink)  
Antiguo 22/07/2015, 12:50
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Fallo de funcion DATEADD

creo que tienes una consulta demasiado complicada para lo que quieres lograr, una diferencia como la que planteas se puede hacer de una forma mas sencilla:


Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. [año] INT,
  4. mes INT,
  5. ingresos INT
  6. )
  7.  
  8.  
  9. INSERT INTO #temp VALUES (2015, 3 ,1500)
  10. INSERT INTO #temp VALUES (2015, 2 ,1400 )
  11. INSERT INTO #temp VALUES (2015, 1 ,1330 )
  12. INSERT INTO #temp VALUES (2014, 12, 1630)
  13.  
  14. SELECT *, IDENTITY(INT,1,1) AS rn INTO #temp2 FROM #temp AS t1
  15.  
  16. SELECT t1.*, (isnull(t1.ingresos-t2.ingresos,0)) AS diferencia FROM #temp2 AS t1
  17. LEFT JOIN #temp2 AS t2 ON (t1.rn+1=t2.rn)

Y ahi tienes el resultado:

año mes ingresos diferencia
2015 3 1500 100
2015 2 1400 70
2015 1 1330 -300
2014 12 1630 0

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 24/07/2015, 06:12
 
Fecha de Ingreso: julio-2015
Ubicación: Barcelona
Mensajes: 4
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Fallo de funcion DATEADD

Hola. Gracias por vuestras respuestas.

Libras. Creo que el codigo que me has dado supera mi nivel de entendimiento. Tambien admito que he detallado poco mi caso y que ademas trabajo con SQL server 2000 (dentro de Ms Access), lo que no se si las funciones que has usado estan disponibles.

Primero aclaro que mi tabla contiene las ventas por dias, por lo que el sistema tiene que sumar los ingresos por mes, agruparlos y comprarlos con el mes anterior.

Sabeis algun sistema mas sencillo con mi anticuado sql server??

Muchas gracias por vuestra ayuda.
  #6 (permalink)  
Antiguo 24/07/2015, 12:28
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Fallo de funcion DATEADD

se puede hacer una simulacion del row_number con sql 2000, y creo que funciona con access, pero se ocuparia conocer con exactitud tus datos para poder generar al consulta que te resuelva el problema.
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 24/07/2015, 13:54
 
Fecha de Ingreso: julio-2015
Ubicación: Barcelona
Mensajes: 4
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Fallo de funcion DATEADD

OK. Mi tabla en concreto contiene los siguientes campos:

idpuntoventa = numerico que hace referencia a la tienda (tienda1, tienda2, ...)
fecha = fecha del dia que se hace caja
ingresos = ingresos brutos

ejemplo: tabla ingresos

1 27/01/15 800
1 03/01/15 500
1 15/12/14 650
1 05/12/14 730
2 20/01/15 350
2 12/01/15 420
2 18/12/14 580

Resultado de mi consulta:

Id Año Mes SumaMes DiferenciaMesAnterior
1 2015 1 1300 -80
1 2014 12 1380
2 2015 1 770 190
2 2014 12 580

El resultado es la suma de las ingresos registrados, agrupados por puntodeventa, año y mes y la diferencia con la suma del mes anterior.

Espero haberme expresado bien.
Muchas gracias por vuestra ayuda.

Etiquetas: fallo, funcion, select, server, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:47.