SQL - Duda con consulta

 
Vista:

Duda con consulta

Publicado por Alejandra (3 intervenciones) el 19/07/2017 10:48:58
Hola, y gracias de antemano
Tengo un problema con el desarrollo de una consulta de sql en pgadmin la cual me esta dando muchos problemas, os la planteo por si me podeis ayudar:
Tengo 2 tablas T_Contrato y T_Tramos, en la tabla de contratos aparece entre otros datos el contrato, el comercial y el total,
en la tabla de tramos se especifica para cada tramo las ventas que hay, pe.
de 1 a 100 € se considera como una venta
de 101 a 200 se considera como dos venta
de 201 a 300 se considera como tres y asi sucesivamente
Lo que necesito es una consulta que para cada uno de los comerciales me indique el numero total de ventas teniendo en cuenta la ponderación de la tabla de Tramos.
P.E.
T_contratos
1 1 80 (sumaria como 1 venta)
2 1 105 (sumaria como 2 ventas)
3 1 60 (sumaria como 1 venta)
4 2 205 (sumaria como 3 ventas)
El resultado de la consulta seria
comercial Nº vtas
1 4
2 3
Espero haberme explicado y muchas gracias
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

Duda con consulta

Publicado por leonardo_josue (1175 intervenciones) el 19/07/2017 17:50:32
Hola Alejandra:

Aunque en tu correo no lo dices específicamente, creo que estás trabajando con una BD's de PosgreSQL... lamentablemente no tengo forma para probar la consulta, pero te dejo un ejemplo de cómo sería en MySQL para que busques su equivalencia...

Tu problema se resuelve haciendo unas cuantas operaciones matemáticas... y más en especifico una DIVISION ENTERA, ¿cómo funciona? pues te regresa la parte entera de una división de dos números:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT 7 DIV 3;
+---------+
| 7 DIV 3 |
+---------+
|       2 |
+---------+
1 row in set (0.02 sec)
 
mysql> SELECT 105 DIV 100;
+-------------+
| 105 DIV 100 |
+-------------+
|           1 |
+-------------+
1 row in set (0.01 sec)

Observa el segundo caso, el resultado de la divisón entera es 1, pero para tu caso simplemente agregas 1:

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
mysql> SELECT * FROM t_contratos;
+--------+--------+--------+
| campo1 | campo2 | campo3 |
+--------+--------+--------+
|      1 |      1 |     80 |
|      2 |      1 |    105 |
|      3 |      1 |     60 |
|      4 |      2 |    205 |
|      5 |      2 |    299 |
|      6 |      2 |    300 |
+--------+--------+--------+
4 rows in set (0.00 sec)
 
mysql> SELECT
    ->   campo1,
    ->   campo2,
    ->   campo3,
    ->   (campo3 DIV 100 + 1) total_ventas
    -> FROM t_contratos;
+--------+--------+--------+--------------+
| campo1 | campo2 | campo3 | total_ventas |
+--------+--------+--------+--------------+
|      1 |      1 |     80 |            1 |
|      2 |      1 |    105 |            2 |
|      3 |      1 |     60 |            1 |
|      4 |      2 |    205 |            3 |
|      5 |      2 |    299 |            3 |
|      6 |      2 |    300 |            4 |
+--------+--------+--------+--------------+
4 rows in set (0.00 sec)

MUCHO OJO: Esta consulta tiene un "error" intencional y es el último de los casos... si observas para el caso del 300 te está contabilizando 4 ventas, cuando deberían ser 3 según tu requerimiento... ¿cómo te imaginas que podrías resolver este caso?

Haz la prueba 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

Duda con consulta

Publicado por Alejandra (3 intervenciones) el 20/07/2017 09:35:30
Hola Leo, gracias por tu respuesta, como bien dices uso PosgreSQL, el problema es que la tabla de tramos que he puesto es de ejemplo la verdadera es muy distinta y puede cambiar en el tiempo
Min Max NVentas
0 899 0,5
900 975 1
976 1755 1,5
1756 2145 2
2145 3000 3
Esta es parte de la tabla de tramos para hacer la ponderacion, por eso tengo que emplear las dos tablas y además tengo que hacer el acumulado del mes para cada uno de los comerciales, asi que estoy en un punto muerto x-(
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

Duda con consulta

Publicado por Alejandra (3 intervenciones) el 20/07/2017 11:01:34
He resuelto el problema, os dejo el codigo:

1
2
3
4
5
6
7
select cod_comisionista,
  sum ( (select nventas from te_tramos
         where te_contrato.total <= te_tramos.maximo
         limit 1)) as NVentas
from te_contrato
where fec_venta between '20170601' and '20170630'
group by cod_comisionista_v

Ahora me queda otra parte que aun no la he resuelto, voy a intentarlo y si me surgen dudas os haré otra visita ;-)
Gracias por los aportes 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