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

Como hacer esta consulta...

Estas en el tema de Como hacer esta consulta... en el foro de Mysql en Foros del Web. Hola, buenos días. Tengo una duda para realizar una consulta. Les explico: Tengo dos tablas, una se llama mod_pedidos y la otra submod_pedidos . La ...
  #1 (permalink)  
Antiguo 26/05/2014, 12:34
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Como hacer esta consulta...

Hola, buenos días.

Tengo una duda para realizar una consulta. Les explico:

Tengo dos tablas, una se llama mod_pedidos y la otra submod_pedidos. La diferencia radica en que en la primera, almacena ciertos datos como el folio, fechas de emisión, cancelación, algunos datos fiscales y el total del pedido y la segunda, es un detalle de los productos relacionados con cada pedido de mod_pedidos.

Código SQL:
Ver original
  1. mod_pedidos
  2. ===============
  3. id_pedido    
  4. ped_id_empresa       
  5. ped_id_cliente  
  6. ped_folio        
  7. ped_folio_fiscal             
  8. ped_serie_csd        
  9. ped_fecha_emision        
  10. ped_lugar_emision        
  11. ped_serie_sat            
  12. ped_fecha_certificacion          
  13. ped_fecha_elaboracion            
  14. ped_fecha_cancelacion            
  15. ped_detalle          
  16. ped_moneda           
  17. ped_tipo_pago        
  18. ped_total  
  19. ped_total_costo      
  20. ped_estatus      
  21. ped_tipo         
  22. ped_sello_cfdi   
  23. ped_sello_sat        
  24. ped_cadena  
  25. ped_qr       
  26. ped_observaciones

Código MySQL:
Ver original
  1. submod_pedidos
  2. ================
  3. id_subpedido    
  4. ped_id_pedido        
  5. ped_cantidad         
  6. ped_detalle              
  7. ped_detalle_personalizado            
  8. ped_unidad           
  9. ped_precio       
  10. ped_precio_costo        
  11. ped_importe          
  12. ped_subtotal        
  13. ped_descuento        
  14. ped_descuento_total          
  15. ped_iva          
  16. ped_exento      
  17. ped_gravado          
  18. ped_isr_retenido         
  19. ped_iva_retenido        
  20. ped_total

Bueno, el problema radica en lo siguiente. Yo por medio de PHP muestro la siguiente consulta:



derivada de:

Código MySQL:
Ver original
  1. Select id_clientes, cli_razon_social, cli_rfc, ped_folio, ped_fecha_elaboracion, ped_fecha_cancelacion, ped_total, ped_estatus, ped_tipo From mod_clientes Left Join mod_pedidos On(id_clientes = ped_id_cliente) Where ped_fecha_elaboracion Between '$fecha1' And '$fecha2'

pero necesito mostrar en cada fila (que corresponde a cada pedido) el total de los descuentos. Estos descuentos se aplican a cada artículo por lo que cada pedido puede tener más de un artículo con o sin descuentos. Traté de usar la función Group Concat de Mysql, pero no me muestra la información como la necesito. Por citar un ejemplo:

Yo necesito que salga así:

Folio Pedido: P-001
Fecha Elaboración: 2014-05-23
Fecha Cancelación: 0000-00-00
Cliente: Bideas y Programación
Total Pedido: 2,400.00
Descuentos: <- Si el pedido hubiera tenido 3 artículos y algunos de ellos con descuento, mostrar el total por pedido ->
Total Costos: 1,700.00
Utilidad: 700.00
Estado del Pedido: PC

La forma fácil de hacerlo, se me ocurre, agregar un campo de total de descuento en la tabla de mod_pedidos y cuando cree el pedido, solamente guardar ese valor, pero quiero saber si por medio de consultas puedo lograrlo.

De antemano, agradezco por sus comentarios. Saludos y que tengan un excelente inicio de semana!!
  #2 (permalink)  
Antiguo 26/05/2014, 18:39
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 10 años, 8 meses
Puntos: 4
Respuesta: Como hacer esta consulta...

Buen día compañero, me parece que tus tablas están mal relacionadas, pude darme cuenta que en la tabla detalle es decir "submod_pedidos" tenes la clave foranea como "ped_id_pedido " y no como "id_pedido" (como debe ser), bueno cuando logres hacer bien la relación foranea paso a lo siguiente, consulta es muy sencilla, basta con hacer esto:

Código MySQL:
Ver original
  1. SELECT a.ped_folio, a.ped_fecha_elaboracion, a.ped_fecha_cancelacion, a.ped_total, a.ped_estatus, a.ped_tipo, b.cliente, SUM(c.ped_descuento) AS descuentos
  2. FROM mod_pedidos a LEFT JOIN mod_clientes b ON a.id_cliente = b.id_cliente LEFT JOIN submod_pedidos c ON a.id_pedido=c.id_pedido
  3. WHERE a.ped_fecha_elaboracion Between '$fecha1' And '$fecha2'

podés relacionar cuantas tablas querras.
  #3 (permalink)  
Antiguo 27/05/2014, 08:46
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Respuesta: Como hacer esta consulta...

Una pregunta... ¿las llaves foráneas deben llevar siempre el mismo nombre? Yo siempre las había usado como en el ejemplo que muestro en este post, con un nombre similar pero con un prefijo distinto.

Por otro lado, si uso sum(ped_descuento) as descuentos, lo que hace es que me devuelve un solo registro pero con la sumatoria de todos los descuentos.

Gracias por responder oscurogt!!
  #4 (permalink)  
Antiguo 27/05/2014, 08:58
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: Como hacer esta consulta...

Cita:
Iniciado por Middrel Ver Mensaje
Una pregunta... ¿las llaves foráneas deben llevar siempre el mismo nombre? Yo siempre las había usado como en el ejemplo que muestro en este post, con un nombre similar pero con un prefijo distinto.
Por cuestiones prácticas es conveniente que tengan exactamente el mismo nombre que en su tabla de origen. Lo que es conveniente es que en la tabla de origen no tengan nombres como "ID", "COD" o cosas así, sino que le agregues un prefijo que identifique a la propia tabla.
Como método, te permite identificar los campos que son FK en una tabla sin necesidad de andar haciendo más averiguaciones, e incluso identificar a qué tabla pertenece.
Es una cuestión de eficiencia de desarrollos, no de "reglas" de BBDD.

Cita:
Iniciado por Middrel Ver Mensaje
Por otro lado, si uso sum(ped_descuento) as descuentos, lo que hace es que me devuelve un solo registro pero con la sumatoria de todos los descuentos.
Un SUm devovlerá siempre un único registro y valor si no usas GROUP BY sobre algún otro campo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 27/05/2014, 09:14
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 10 años, 8 meses
Puntos: 4
Respuesta: Como hacer esta consulta...

@gnzsoloyo tiene razón no es la regla pero te ayuda a agilizar las consultas. Lo que hace SUM como su prefijo lo indica es sumar todos los registros que hayas seleccionado, en este caso todos los que están entre las fechas que seleccionaste y que coincidan con el ID maestro.
  #6 (permalink)  
Antiguo 27/05/2014, 09:30
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Respuesta: Como hacer esta consulta...

Ok, entiendo. yo lo que hacía regularmente con las llaves foráneas era:

Tabla: Clientes
prefijo cli_

Tabla: Pedidos
prefijo ped_

y si se relacionaban en algún momento hacía:

ped_id_cliente -> id_clientes

y si tuviera otra tabla, por ejemplo:
Tabla: Cobranza
prefijo cob_

ped_id_cliente -> id_cliente
cob_id_cliente -> id_cliente
cob_id_pedido -> id_pedido

Pero estudiaré más a fondo sobre buenas prácticas sobre este tema ^^

Por otro lado, intentaré con el Group By para ver si me funciona de esa forma y lo comento.

Gracias gnzsoloyo, oscurogt!! :D
  #7 (permalink)  
Antiguo 27/05/2014, 13:05
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Respuesta: Como hacer esta consulta...

Les agradezco por sus comentarios. Funcionó de la siguiente manera:

Código SQL:
Ver original
  1. SELECT id_clientes, cli_razon_social, cli_rfc, ped_folio, ped_fecha_elaboracion, ped_fecha_cancelacion, pedidos.ped_total AS ped_total, ped_estatus, ped_tipo, SUM(ped_descuento) AS ped_descuento FROM mod_clientes
  2.  
  3. LEFT JOIN mod_pedidos AS pedidos ON(id_clientes = ped_id_cliente)
  4. LEFT JOIN submod_pedidos ON(id_pedido = ped_id_pedido)  
  5.  
  6. WHERE ped_fecha_elaboracion BETWEEN '$fecha1' AND '$fecha2'
  7.  
  8. GROUP BY (ped_folio)

Saludos!!

Última edición por gnzsoloyo; 27/05/2014 a las 13:24
  #8 (permalink)  
Antiguo 11/06/2014, 09:12
 
Fecha de Ingreso: agosto-2013
Ubicación: Guatemala
Mensajes: 137
Antigüedad: 10 años, 8 meses
Puntos: 4
Respuesta: Como hacer esta consulta...

No hay de que, es un gusto ayudar...

Saludos.

Cita:
Iniciado por Middrel Ver Mensaje
Les agradezco por sus comentarios. Funcionó de la siguiente manera:

Código SQL:
Ver original
  1. SELECT id_clientes, cli_razon_social, cli_rfc, ped_folio, ped_fecha_elaboracion, ped_fecha_cancelacion, pedidos.ped_total AS ped_total, ped_estatus, ped_tipo, SUM(ped_descuento) AS ped_descuento FROM mod_clientes
  2.  
  3. LEFT JOIN mod_pedidos AS pedidos ON(id_clientes = ped_id_cliente)
  4. LEFT JOIN submod_pedidos ON(id_pedido = ped_id_pedido)  
  5.  
  6. WHERE ped_fecha_elaboracion BETWEEN '$fecha1' AND '$fecha2'
  7.  
  8. GROUP BY (ped_folio)

Saludos!!

Etiquetas: campo, join, php, select, sql, tabla
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 14:45.