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

[SOLUCIONADO] es posible usar subconsulta en lugar de UNION

Estas en el tema de es posible usar subconsulta en lugar de UNION en el foro de Mysql en Foros del Web. Gracias de antemano por sus consejos. Nesito crear una consulta que genere un estado de cuenta para clientes, una linea seran los datos de la ...
  #1 (permalink)  
Antiguo 23/04/2015, 13:18
 
Fecha de Ingreso: abril-2015
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Pregunta es posible usar subconsulta en lugar de UNION

Gracias de antemano por sus consejos.
Nesito crear una consulta que genere un estado de cuenta para clientes,
una linea seran los datos de la factura y la/las siguientes con los pagos aplicados a esas mismas facturas.
Estoy tratando de filtrar por el campo entity y no hace el filtro.
obvio que esoy generando mal la consulta.
Es posible utilizar subconsultas en lugar de esta UNION

Código SQL:
Ver original
  1. SELECT
  2. f.rowid AS rowid,
  3. f.datef AS datef,
  4.     CASE f.TYPE
  5.         WHEN 0 THEN
  6.             'Factura'
  7.         WHEN 2 THEN
  8.             'Credito'
  9.         ELSE
  10.             'Desconocido'
  11.         END
  12.      AS Tipo_Doc,
  13. f.rowid AS facid,
  14. f.facnumber AS facnumber,
  15. f.fk_soc AS fk_soc,
  16. s.nom AS nom,
  17. IF ((   f.total_ttc >= 1    ),f.total_ttc,'') AS Cargo,
  18. IF ((   f.total_ttc <= 1    ),f.total_ttc,'') AS Abono,
  19.  s.entity AS entity
  20. FROM llx_facture AS f   JOIN llx_societe AS s ON f.fk_soc = s.rowid
  21. WHERE   f.fk_statut BETWEEN 1   AND 2
  22.  
  23. UNION ALL
  24.  
  25. SELECT
  26. p.rowid AS rowid,
  27. p.datep AS datep,
  28. 'PAGO' AS Tipo_Doc,
  29. pf.fk_facture AS facid,
  30. f.facnumber AS facnumber,
  31. f.fk_soc AS fk_soc,
  32. s.nom AS nom,
  33. IF ((pf.amount <= 1),pf.amount,'') AS Cargo,
  34. IF ((pf.amount >= 1),pf.amount,'') AS Abono,
  35. s.entity AS entity
  36. FROM llx_paiement AS p JOIN llx_paiement_facture AS pf ON p.rowid = pf.fk_paiement
  37. JOIN llx_facture AS f ON pf.fk_facture = f.rowid
  38. JOIN llx_societe AS s ON f.fk_soc = s.rowid
  39. WHERE s.entity = 21
  40. ORDER BY facid

Anexo fragmento del resultado separado por comas:

rowid,datef,Tipo_Doc,facid,facnumber,fk_soc,nom,Ca rgo,Cargo,entity
75,2/2/2015 00:00:00,Factura,75,FAC-00001,44,ORGANIZACIÓN AURORA S.A DE C.V,1900.00000000,,18
76,2/2/2015 00:00:00,Factura,76,FAC-00002,44,ORGANIZACIÓN AURORA S.A DE C.V,750.00000000,,18
80,2/2/2015 00:00:00,Credito,80,NCR-00001,44,ORGANIZACIÓN AURORA S.A DE C.V,,-1900.00000000,18
81,2/2/2015 00:00:00,Credito,81,NCR-00002,44,ORGANIZACIÓN AURORA S.A DE C.V,,-750.00000000,18
90,2/2/2015 00:00:00,Factura,90,FAC-00004,43,VERONICA SANTOS JOACHIN,500001.25000000,,18
92,2/2/2015 00:00:00,Factura,92,FAC-00005,43,VERONICA SANTOS JOACHIN,590000.18000000,,18
39,20/2/2015 12:00:00,PAGO,192,FAC-00035,106,PROMOTORA HOTELERA ORIGINAL SA DE CV,,638.12000000,21
192,16/2/2015 00:00:00,Factura,192,FAC-00035,106,PROMOTORA HOTELERA ORIGINAL SA DE CV,638.12000000,,21
28,19/2/2015 12:00:00,PAGO,193,FAC-00036,100,GRUPO MAJOSA SA DE CV,,939.60000000,21
193,17/2/2015 00:00:00,Factura,193,FAC-00036,100,GRUPO MAJOSA SA DE CV,939.60000000,,21
194,11/2/2015 00:00:00,Factura,194,FAC-01961,19,GRUPO INDUSTRIAL CREYSI, S.A. DE C.V.,31237.18000000,,17
196,11/2/2015 00:00:00,Factura,196,FAC-01963,19,GRUPO INDUSTRIAL CREYSI, S.A. DE C.V.,35253.79000000,,17
198,12/2/2015 00:00:00,Factura,198,FAC-01964,19,GRUPO INDUSTRIAL CREYSI, S.A. DE C.V.,63336.00000000,,17
199,12/2/2015 00:00:00,Factura,199,FAC-01965,19,GRUPO INDUSTRIAL CREYSI, S.A. DE C.V.,8184.96000000,,17

Última edición por gnzsoloyo; 23/04/2015 a las 13:31
  #2 (permalink)  
Antiguo 23/04/2015, 13:35
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: es posible usar subconsulta en lugar de UNION

Cita:
Es posible utilizar subconsultas en lugar de esta UNION
¿Tienes claro el uso de UNION y las subconsultas?
Son cosas total y absolutamente diferentes.

El UNION encadena un resultado de una consulta al resultaod d ela otra, pero tienen como regla que deben tener ambas la misma cantidad de columnas, del mismo tipo y en el mismo orden.
Extensivamente, se dice que las columnas de todas las consutlas unidas deben poseer el mismo dominio, por lo que no peudes mezclar caballos con manzanas, como estás haciendo.
No es lo mismo hablar de Facturas que Pagos.

En todo caso, si en cada línea debe aparecer una factura con sus pagos, eso es una consulta agrupada con agregación y subtotales, y la sintaxis dependerá del DBMS usado... que no nos estás diciendo.

¿Qué DBMS se supone que usas?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 23/04/2015, 13:40
 
Fecha de Ingreso: abril-2015
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Respuesta: es posible usar subconsulta en lugar de UNION

Gracias por tu respuesta,
Estoy usando MySQL
  #4 (permalink)  
Antiguo 23/04/2015, 14:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: es posible usar subconsulta en lugar de UNION

Hola marenas4001:

No se si entendí correctamente el problema, pero creo que la confusión viene en entender como funciona la cláusula WHERE en el UNION.

Veamos este ejercicio para ver si es más o menos lo que quieres, supongamos que tienes estas dos tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | one         |
  16. |    2 | two         |
  17. |    3 | three       |
  18. +------+-------------+
  19. 3 rows in set (0.00 sec)

tal como lo comento gnzsoloyo, UNION nos sirve para encadenar resultados, es decir, si quieres obtener por ejemplo lo los elementos con ID = 1 de ambas tablas, podrías hacer esto:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM tabla1
  2.     -> UNION
  3.     -> SELECT id, descripcion FROM tabla2 WHERE id = 1;
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    1 | uno         |
  8. |    2 | dos         |
  9. |    3 | tres        |
  10. |    1 | one         |
  11. +------+-------------+
  12. 4 rows in set (0.00 sec)

¿qué paso entonces? que el filtro WHERE sólo afecta a la segunda parte de la consulta... en tu caso mencionas que quieres filtrar por el campo ENTITY, sin embargo este campo SÓLO EXISTE EN LA SEGUNDA PARTE DEL UNION

Aquí tendrías dos opciones, una sería agregar un FILTRO EN AMBAS CONSULTAS, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT id, descripcion FROM tabla1 WHERE id = 1
  2.     -> UNION
  3.     -> SELECT id, descripcion FROM tabla2 WHERE id = 1;
  4. +------+-------------+
  5. | id   | descripcion |
  6. +------+-------------+
  7. |    1 | uno         |
  8. |    1 | one         |
  9. +------+-------------+
  10. 2 rows in set (0.00 sec)

o en su defecto, hacer primero la UNION y después filtrar el resultado con una subconsulta, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM
  2.     -> ( SELECT id, descripcion FROM tabla1
  3.     ->   UNION
  4.     ->   SELECT id, descripcion FROM tabla2
  5.     -> ) T
  6.     -> WHERE id = 1;
  7. +------+-------------+
  8. | id   | descripcion |
  9. +------+-------------+
  10. |    1 | uno         |
  11. |    1 | one         |
  12. +------+-------------+
  13. 2 rows in set (0.00 sec)

No sé si esto es lo que necesitas, haz la prueba y nos comentas.

Saludos
Leo.
  #5 (permalink)  
Antiguo 23/04/2015, 14:41
 
Fecha de Ingreso: abril-2015
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Respuesta: es posible usar subconsulta en lugar de UNION

Efectivamente, con agregar este WHERE a la primera consulta, funciona el filtro perfectamente.
Te agradezco tu respuesta.

Tambien tengo que decir que si estoy mezclando dos cosas distintas, el problema es que necesito las dos lineas separadas una por Facturas y otra por Pagos en la misma consulta(no hay problema si lo hago por codigo) desgraciadamente es para un reporteador (Reportico Ver 1.0) que no soporta muy bien el uso de UNION ni permite codigo PHP y si genero la consulta en una sola linea no tengo forma de separala para su presentacion.

Etiquetas: bases-de-datos-general, subconsulta, union
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:47.