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

Simplificar consulta?

Estas en el tema de Simplificar consulta? en el foro de Mysql en Foros del Web. Hola buen día! Quisiera pedir de su ayuda ya que soy nuevo con esto de mysql Tengo una base de datos de la siguiente forma ...
  #1 (permalink)  
Antiguo 30/04/2018, 14:41
 
Fecha de Ingreso: febrero-2016
Mensajes: 43
Antigüedad: 8 años, 8 meses
Puntos: 2
Simplificar consulta?

Hola buen día!

Quisiera pedir de su ayuda ya que soy nuevo con esto de mysql

Tengo una base de datos de la siguiente forma

Tabla clientes
folioCliente PK
nombre etc....

tabla pedidos
idPedido PK
folioCliente FK
...

tabla pediFact
id PK
idPedido FK
numeroFactura FK
importePedido ...

tabla facturas
numeroFactura PK
desc ....

tabla factuPago
id PK
numeroFactura FK
folioPago FK

tabla pagos
folioPago PK
desc...

como pueden ver un cliente puede tener muchos pedidos un pedido puede tener una o mas facturas y de igual modo con los pagos

Lo que necesito es extraer los clientes con sus respectivos adeudos y ordenarlos del mayor al menor

Lo que tengo es:

extraigo todos los clientes ordenados
Código SQL:
Ver original
  1. SELECT folioCliente, nombreCliente, nombreEmpresa FROM clientes ORDER BY nombreCliente ASC

Con php obtengo los resultados con un while y realizo las siguientes consultas

Sumatoria de todas las facturas pendiente de pago
Código MySQL:
Ver original
  1. select sum(montoFactura) from facturas where statusFactura = 'FPP' and cliente = 'folioCliente'

Sumatoria de precios de pedido que estan sin facturar
Código SQL:
Ver original
  1. SELECT SUM(precioPedido) FROM pedidos WHERE statusPedido = 'SF' AND folioCliente = 'folioCliente'

Sumatoria de precio de pedido que estan facturados parcial
Código SQL:
Ver original
  1. SELECT SUM(precioPedido) FROM pedidos WHERE statusPedido = 'FP' AND folioCliente = 'folioCliente'

Sumatoria de todos los importes de los pedidos que estan facturados parcialmente
Código SQL:
Ver original
  1. SELECT SUM(importePedido) FROM pediFact pf INNER JOIN pedidos p ON pf.idPedido=p.idPedido WHERE p.statusPedido = 'FP' AND folioCLiente = 'folioCliente'

Y con la información extraida de estas consultas puedo extraer el pendiente por cobrar por cada cliente, solo que no puedo ordenarla de mayor a menor

Hay alguna otra forma mas sencilla para extraer está información que no haga tantas consultas a la BD????

Intente sumar el precio de pedido por cada cliente con inner join entre todas las tablas pero no obtengo el mismo resultado que si lo hago individual por cada cliente esta fue mi consulta

Código MySQL:
Ver original
  1. SELECT SUM(precioPedido) AS totalPedido, nombreCliente AS Cliente FROM clientes c
  2.     INNER JOIN pedidos p ON c.folioCliente=p.folioCliente
  3.     INNER JOIN pediFact pf ON p.idPedido=pf.idPedido
  4.     INNER JOIN facturas f ON pf.numeroFactura=f.numeroFactura
  5.     INNER JOIN factuPago fp ON f.numeroFactura=fp.numeroFactura
  6.     INNER JOIN pagos pa ON fp.folioPago=pa.folioPago
  7. GROUP BY c.nombreCliente;

Agradezco su ayuda ya que mis conocimientos con mysql son muy basicos.

GRACIAS!
  #2 (permalink)  
Antiguo 30/04/2018, 15:01
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Simplificar consulta?

Cita:
Iniciado por webtexcoco Ver Mensaje
Hola buen día!

Hay alguna otra forma mas sencilla para extraer está información que no haga tantas consultas a la BD????
Si, podrias usar cases, y con subqueries y agrupaciones sacar la informacion que necesitas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 06/05/2018, 15:28
Avatar de vicram10  
Fecha de Ingreso: enero-2009
Ubicación: Asuncion
Mensajes: 326
Antigüedad: 15 años, 9 meses
Puntos: 27
Respuesta: Simplificar consulta?

asi como menciona Libras, es agregando a tu select principal, subqueries.

Código MySQL:
Ver original
  1. SELECT folioCliente, nombreCliente, nombreEmpresa,
  2.             (select sum(campo_a_sumar) from tabla1 where tu_condicion) tabla1,
  3.             (select sum(campo_a_sumar) from tabla2 where tu_condicion) tabla2,
  4.             (select sum(campo_a_sumar) from tabla3 where tu_condicion) tabla3,
  5.             (select sum(campo_a_sumar) from tabla4 where tu_condicion) tabla4
  6. FROM clientes
  7. ORDER BY nombreCliente ASC
__________________
Asunción Paraguay
Licenciado - Desarrollador Web - Lider de Proyecto/Desarrollador Banco Local
Espacio Geek - Comunidad Tecnologica

Etiquetas: group, join, simplificar, sql, tabla, tablas
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 22:33.