Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Sum donde el total sea igual a un valor (https://www.clubdelphi.com/foros/showthread.php?t=93749)

look 12-02-2019 00:27:35

Sum donde el total sea igual a un valor
 
hola amigos , tengo la siguiente SQL:

Código SQL [-]
  SELECT
  SUPERVIS.COD_ESC,
  SUPERVIS.COD_SUP,
  VENTAS.COD_FAM,
  SUM(VENTAS.CANT * PRODUCTS.PES_VOL) AS TOTAL
  FROM ZONAS
  INNER JOIN SUCURSALS ON SUCURSALS.COD_ZON = ZONAS.COD_ZON  
  INNER JOIN JEFES ON JEFES.COD_SUC = SUCURSALS.COD_SUC    
  INNER JOIN SUPERVIS ON SUPERVIS.COD_JEF = JEFES.COD_JEF 
  INNER JOIN RUTAS ON RUTAS.COD_SUP = SUPERVIS.COD_SUP 
  INNER JOIN VENTAS ON VENTAS.COD_RUT = RUTAS.COD_RUT
  INNER JOIN PRODUCTS ON PRODUCTS.COD_PROD = VENTAS.COD_PROD
  INNER JOIN FAMILIAS ON FAMILIAS.COD_FAM = VENTAS.COD_FAM
  WHERE 
  DATEPART(MONTH,VENTAS.Fech_fact) = 1
  AND DATEPART(YEAR,VENTAS.Fech_fact) = 2019
  AND SUPERVIS.COD_SUP = 10111 
  AND VENTAS.TIP_DOC NOT IN ( 'z105','z106','z405')
  GROUP BY 
  SUPERVIS.COD_SUP,
  VENTAS.COD_FAM,
  SUPERVIS.COD_ESC

lo que me da el siguiente resultado:



Código:

totalizando: 95,190.35
lo que estoy tratando de hacer:

Código SQL [-]
  SUPERVIS.COD_ESC,
  SUPERVIS.COD_SUP,
  VENTAS.COD_FAM,
  SUM(VENTAS.CANT * PRODUCTS.PES_VOL) AS TOTAL
  FROM ZONAS
  INNER JOIN SUCURSALS ON SUCURSALS.COD_ZON = ZONAS.COD_ZON  
  INNER JOIN JEFES ON JEFES.COD_SUC = SUCURSALS.COD_SUC    
  INNER JOIN SUPERVIS ON SUPERVIS.COD_JEF = JEFES.COD_JEF 
  INNER JOIN RUTAS ON RUTAS.COD_SUP = SUPERVIS.COD_SUP 
  INNER JOIN VENTAS ON VENTAS.COD_RUT = RUTAS.COD_RUT
  INNER JOIN PRODUCTS ON PRODUCTS.COD_PROD = VENTAS.COD_PROD
  INNER JOIN FAMILIAS ON FAMILIAS.COD_FAM = VENTAS.COD_FAM
  WHERE 
  DATEPART(MONTH,VENTAS.Fech_fact) = 1
  AND DATEPART(YEAR,VENTAS.Fech_fact) = 2019
  AND SUPERVIS.COD_SUP = 10111 
  AND VENTAS.TIP_DOC NOT IN ( 'z105','z106','z405')
  GROUP BY 
  SUPERVIS.COD_SUP,
  VENTAS.COD_FAM,
  SUPERVIS.COD_ESC
  HAVING   SUM(VENTAS.CANT * PRODUCTS.PES_VOL) <= 75000

pero la consulta muestra el mismo resultado, al hacer la suma total no se acerca a 75000,
la idea es que me muestre el detalle , donde la sumatoria de todo ese detalle que mostre sea <= 75000.

Me hechan una mano?.

Saludos!

Casimiro Notevi 12-02-2019 09:18:00

Creo que tendrás que hacer un "Stored procedure" con un bucle que vaya sumando mientras la suma sea menor a esa cantidad.
Si lo he entendido bien.

look 12-02-2019 15:05:33

Cita:

Empezado por Casimiro Notevi (Mensaje 530627)
Creo que tendrás que hacer un "Stored procedure" con un bucle que vaya sumando mientras la suma sea menor a esa cantidad.
Si lo he entendido bien.

si amigo, justo esto pensaba, pero como ultima opcion.
me dan alguna idea del pocedimiento?, estoy pensando hacer un bucle que vaya sumando dia a dia hasta llegar al parametro requerido.
cualquier idea es bienvenida.

mamcx 12-02-2019 16:29:50

Para este caso es ideal las funciones window:

https://tapoueh.org/blog/2013/08/und...dow-functions/

que están desde sql server 2012:

https://docs.microsoft.com/en-us/sql...ql-server-2017

en especial, creo que te sirve un "moving average".

look 12-02-2019 16:46:45

Cita:

Empezado por mamcx (Mensaje 530632)
Para este caso es ideal las funciones window:

https://tapoueh.org/blog/2013/08/und...dow-functions/

que están desde sql server 2012:

https://docs.microsoft.com/en-us/sql...ql-server-2017

en especial, creo que te sirve un "moving average".

Gracias amigo, estudiare lo que me pasaste.
tambien, si hechas una mano modificando mi SQL lo agradecere mucho, asi tendre mas clara la idea.

Saludos!

look 12-02-2019 21:38:44

Hola amigos, quiciera agregarle la columna de acumulados, esto es lo que tengo:

Código SQL [-]
  SELECT
  SUPERVIS.COD_ESC,
  SUPERVIS.COD_SUP,
  VENTAS.COD_FAM,
  SUM(VENTAS.CANT * PRODUCTS.PES_VOL) AS TOTAL,
  SUM(VENTAS.CANT * PRODUCTS.PES_VOL) OVER (PARTITION BY VENTAS.COD_FAM) as ACUMULADO
  FROM ZONAS
  INNER JOIN SUCURSALS ON SUCURSALS.COD_ZON = ZONAS.COD_ZON  
  INNER JOIN JEFES ON JEFES.COD_SUC = SUCURSALS.COD_SUC    
  INNER JOIN SUPERVIS ON SUPERVIS.COD_JEF = JEFES.COD_JEF 
  INNER JOIN RUTAS ON RUTAS.COD_SUP = SUPERVIS.COD_SUP 
  INNER JOIN VENTAS ON VENTAS.COD_RUT = RUTAS.COD_RUT
  INNER JOIN PRODUCTS ON PRODUCTS.COD_PROD = VENTAS.COD_PROD
  INNER JOIN FAMILIAS ON FAMILIAS.COD_FAM = VENTAS.COD_FAM
  WHERE 
  DATEPART(MONTH,VENTAS.Fech_fact) = 1
  AND DATEPART(YEAR,VENTAS.Fech_fact) = 2019
  AND SUPERVIS.COD_SUP = 10111 
  AND VENTAS.TIP_DOC NOT IN ( 'z105','z106','z405')
  GROUP BY 
  SUPERVIS.COD_SUP,
  VENTAS.COD_FAM,
  SUPERVIS.COD_ESC

Pero me da error, ¿que podra ser?

Casimiro Notevi 12-02-2019 22:00:54

Cita:

Empezado por look (Mensaje 530644)
Pero me da error, ¿que podra ser?

¿Qué error? ;)

look 12-02-2019 22:02:57

Cita:

Empezado por Casimiro Notevi (Mensaje 530646)
¿Qué error? ;)

Cita:

Mens. 8120, Nivel 16, Estado 1, Línea 6
La columna 'VENTAS.CANT' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.
Mens. 8120, Nivel 16, Estado 1, Línea 6
La columna 'PRODUCTS.PES_VOL' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.
.
:/ ......

mamcx 12-02-2019 22:25:11

Cita:

Empezado por look (Mensaje 530633)
Gracias amigo, estudiare lo que me pasaste.
tambien, si hechas una mano modificando mi SQL lo agradecere mucho, asi tendre mas clara la idea.

Saludos!

Y como quieres que lo haga? No tengo los datos iniciales. Si suponemos que el resultado que mostraste esta bien y de hay se hace el filtro, entonces es un subquery, y al menos necesitaríamos los datos en texto.

abelg 06-06-2021 03:02:00

Por si aun estas con la duda
 
Te mando un ejemplo pequeño como podrías plantear la solución.
Código SQL [-]
CREATE TABLE #Ventas
(
  Cod_Sup Varchar(25) not null,
  Cod_Esc Varchar(25) not null,
  Cod_Fam int not null,
  Cod_producto int,
  Cantidad int,
)

CREATE TABLE #Producto
(
  Cod_Preoducto int identity not null,
  Nombre varchar(25) not null,
  Pes_vol money not null
)

INSERT #Producto Values ('xxx', 2360.25)
INSERT #Producto Values ('yyy', 360.25)
INSERT #Producto Values ('zzz', 1560.25)
INSERT #Producto Values ('aaa', 4260.25)

INSERT #Ventas Values('1', '10111', 1, 1, 3)
INSERT #Ventas Values('1', '10111', 1, 1, 5)
INSERT #Ventas Values('1', '10111', 1, 1, 3)

INSERT #Ventas Values('1', '10111', 2, 3, 3)

INSERT #Ventas Values('1', '10111', 3, 1, 5)
INSERT #Ventas Values('1', '10111', 3, 3, 4)
INSERT #Ventas Values('1', '10111', 3, 2, 3)

INSERT #Ventas Values('1', '10111', 4, 3, 5)
INSERT #Ventas Values('1', '10111', 5, 2, 4)
INSERT #Ventas Values('1', '10111', 6, 1, 2)
INSERT #Ventas Values('1', '10111', 7, 1, 2)
INSERT #Ventas Values('1', '10111', 8, 2, 18)
INSERT #Ventas Values('1', '10111', 9, 3, 1)
INSERT #Ventas Values('1', '10111', 10, 2, 13)
INSERT #Ventas Values('1', '10111', 11, 2, 15)
INSERT #Ventas Values('1', '10111', 12, 1, 11)
INSERT #Ventas Values('1', '10111', 13, 3, 12)
INSERT #Ventas Values('1', '10111', 14, 1, 17)
INSERT #Ventas Values('1', '10111', 15, 3, 14)
INSERT #Ventas Values('1', '10111', 16, 1, 12)

SELECT Cod_Esc,
  Cod_Sup,
  Cod_Fam,
  Total
FROM  (SELECT Cod_Esc,
      Cod_Sup,
      Cod_Fam,
      SUM(v.Cantidad * p.Pes_vol) Total,
      (SELECT
        SUM(v1.Cantidad * p1.Pes_vol) TotalT
      FROM #Ventas v1
        INNER JOIN #Producto p1 ON p1.Cod_Preoducto = v1.Cod_producto
      WHERE v1.Cod_Fam <= v.cod_Fam
      GROUP BY v1.Cod_Esc, v1.Cod_Sup
      ) GranTotal 
    FROM #Ventas v
    INNER JOIN #Producto p ON p.Cod_Preoducto = v.Cod_producto
    GROUP BY Cod_Esc, Cod_Sup, Cod_Fam
    ) x
WHERE x.GranTotal <= 75000
ORDER BY Cod_Esc, Cod_Sup, Cod_Fam


DROP TABLE #Producto
DROP TABLE #Ventas

Saludos.


La franja horaria es GMT +2. Ahora son las 07:06:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi