SQL - Funciones analiticas

 
Vista:
sin imagen de perfil

Funciones analiticas

Publicado por Carlos_Alberto (3 intervenciones) el 21/02/2017 13:00:24
Hola a todos

tengo un problema que no puedo resolver y para eso hago aqui un ejemplo simple.

Pongamos que tengo como ejemplo esta tabla

COD_COMP ----- PROG_VENTA------IMPORTE
------------------------------------------------------------
1-------------------------1-------------------100
1-------------------------2-------------------150
1-------------------------3-------------------200
1-------------------------4-------------------300
10------------------------1-------------------10
10------------------------2-------------------15
10------------------------3-------------------20
10------------------------4-------------------30
10------------------------6-------------------40
10------------------------7-------------------10
20------------------------1-------------------100
20------------------------2-------------------20
20------------------------8-------------------300


donde

COD_COMP......Codigo Compañia
PROG_VENTA....Progresivo Venta
IMPORTE.......importe de la venta


yo necesitaria hacer una query usando las funciones analiticas (OVER Partition...) donde me de
ls suma de los importes segun cada compañia de la siguiente manera:

COD_COMP------------PROG_VENTA--------IMPORTE
------------------------------------------------------------------------
1--------------------------------1---------------------------0
1--------------------------------2---------------------------100
1--------------------------------3---------------------------250
1--------------------------------4---------------------------450

Vale decir que necesito la suma - el importe del PROG_VENTA corriente, es decir
si en el record corriente es con el PROG_VENTA = 3 me debe dar la suma de IMPORTE del
PROG_VENTA=2 + suma de IMPORTE PROG_VENTA=1

si en el record corriente es con el PROG_VENTA = 5 me debe dar la suma de IMPORTE del
PROG_VENTA=4 + suma de IMPORTE PROG_VENTA=3 + suma de IMPORTE PROG_VENTA=2 + suma de IMPORTE PROG_VENTA=1

Desde ya muchas gracias a quien pueda ayudarme.

Saludos

Carlos
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Funciones analiticas

Publicado por leonardo_josue (1173 intervenciones) el 21/02/2017 17:55:17
Hola Carlos_alberto:

En primer lugar, ¿con qué BD's estás trabajando? puedo suponer que se trata de ORACLE o SQL Server, pero esto solo lo saben Dios y Tú... es importante este dato pues existen diferencias sintácticas entre cada uno de ellos.

Segundo, ¿es absolutamente necesario que obtengas este resultado con funciones analíticas? esto que pides también se puede resolver con subconsultas y puede que te resulte más simple hacerlo.

Tercero, ¿qué es lo que haz intentado hacer? porque supongo que algo haz intentado. Postea tu código aun si tiene error o no te arroja los resultados esperados, de esta manera podemos indicarte dónde está el error o plantearte alguna otra solución.

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
sin imagen de perfil

Funciones analiticas

Publicado por Carlos_alberto (3 intervenciones) el 21/02/2017 21:14:19
Hola Leo
En la empresa se una DB2 pero igualmente las funciones analiticas ya las use antes y me dieron buen resultado. Esto es solo un prototipo de ejemplo de lo que necesito hacer y quisiera hacerlo tambien con funciones analiticas ya que la extracion de datos a realizar son de millones de records por lo tanto las subconsultas por mas buenos que sean los indice habràn un impacto en el sistema bastante alto. Hasta ahora mis intentos fueron vanos porque no soy para nada experto en este tipo de funciones avanzadas. Saludos y gracias por tu interes
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Funciones analiticas

Publicado por leonardo_josue (1173 intervenciones) el 21/02/2017 22:46:17
Hola de nuevo Carlos_alberto:

Lamentablemente tampoco soy experto en funciones analíticas, aunque he trabajado con ellas. De lo que he realizado, no recuerdo alguna manera para que te acumule a partir del siguiente registro, es decir, que no te considere el renglón actual... checa esta sentencia con los datos que tienes de ejemplo:

1
2
3
4
select
  cod_comp, prog_venta, importe,
  sum(importe) over (partition by cod_comp order by cod_comp, prog_venta) acumulado
from tabla;

Esta consulta te regresaría algo muy parecido a lo que necesitas, solo que no te acumula como lo indicas, sino que hace la suma parcial hasta el registro actual:

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
+--------+----------+-------+---------+
|cod_comp|prog_venta|importe|acumulado|
+--------+----------+-------+---------+
|       1|         1|    100|      100|
+--------+----------+-------+---------+
|       1|         2|    150|      250|
+--------+----------+-------+---------+
|       1|         3|    200|      450|
+--------+----------+-------+---------+
|       1|         4|    300|      750|
+--------+----------+-------+---------+
|      10|         1|     10|       10|
+--------+----------+-------+---------+
|      10|         2|     15|       25|
+--------+----------+-------+---------+
|      10|         3|     20|       45|
+--------+----------+-------+---------+
|      10|         4|     30|       75|
+--------+----------+-------+---------+
|      10|         6|     40|      115|
+--------+----------+-------+---------+
|      10|         7|     10|      125|
+--------+----------+-------+---------+
|      20|         1|    100|      100|
+--------+----------+-------+---------+
|      20|         2|     20|      120|
+--------+----------+-------+---------+
|      20|         8|    300|      420|
+--------+----------+-------+---------+

Es cuestión de que investigues si es posible hacer que el PARTITION lo haga a partir de la siguiente posición y no sobre la columna actual.

Y como cultura general, con subconsultas lo podrías hacer así:

1
2
3
4
5
6
7
8
9
10
select
  T1.cod_comp,
  T1.prog_venta,
  T1.importe,
  nvl(( select sum(importe)
        from tabla T2
        where
          T1.cod_comp = T2.cod_comp
          and T2.prog_venta < T1.prog_venta), 0) acumulado
from tabla T1;

Esto sí te daría lo que quieres, pero tienes razón con lo que comentas de que el rendimiento puede no ser óptimo.

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
1
Comentar
sin imagen de perfil

Funciones analiticas

Publicado por Carlos_Alberto (3 intervenciones) el 22/02/2017 09:46:45
MUCHISIMAS GRACIAS LEO!!!!!!!!!!!!
con un simple agregado a la funcion analitica puedo obtener lo que necesito

1
2
3
4
5
6
7
8
SELECT COD_COMP, PROG_VENTA, importe, acumulado-importe AS importe
FROM
(
select
  cod_comp, prog_venta, importe,
  sum(importe) over (partition by cod_comp order by cod_comp, prog_venta) acumulado
from ventas
)

Te paso mi email [email protected] asi por hay estamos en contacto.

Saludos desde Trieste (Italia)

Carlos
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