Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Dudas con Union (https://www.clubdelphi.com/foros/showthread.php?t=12354)

rogeriobeltran 14-07-2004 00:02:28

Dudas con Union
 
Buenas Dias:

Gracias por leer este hilo, mi duda consiste en que tengo que realizar una consulta en una tabla de ventas donde me calcule la cantidad de ventas con descuento con su valor, asi como la cantidad total de ventas con su valor total, realice dos consultas y las uni pero al realizarlas me crean datos repetidos.

La consulta es la siguiente:


SELECT D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO,
0 AS CANTIDADDESCUENTO,
0.0 AS DESCUENTO,
COUNT(*) AS CANTIDADVENTAS,
SUM(D.CANTIDAD*D.PRECIOUNITARIO) AS VENTAS
FROM DetalleEncabezado D
WHERE (D.FECHAVENTA>'07/01/04')
GROUP BY D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO

UNION

SELECT D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO,
COUNT(*) AS CANTIDADDESCUENTO,
SUM(( (D.CANTIDAD*D.PRECIOUNITARIO)*(D.Descuento/100))+( (D.CANTIDAD*D.PRECIOUNITARIO)- (D.CANTIDAD*D.PRECIOUNITARIO*(D.Descuento/100)))*(D.Descuentoencabezado/100)) AS DESCUENTO,
0 AS CANTIDADVENTAS,
0.0 AS VENTAS
FROM DetalleEncabezado D
WHERE (D.FECHAVENTA>'07/01/04')
AND ((D.Descuento > 0) OR (D.descuentoencabezado>0))
GROUP BY D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO

y el resultado que me da es:
Los campos son:

FECHAVENTA
CODIGOCAJA
CODIGOCAJERO
CODIGOTIPOARTICULO
CANTIDADDESCUENTO
DESCUENTO
CANTIDADVENTAS
VENTAS

La información es:

02/07/2004,001,AUX2,01,0,"0,000",253,"654710,000"
02/07/2004,001,AUX2,01,75,"5716,500",0,"0,000"

02/07/2004,001,AUX2,02,0,"0,000",9,"41210,000"
02/07/2004,001,AUX2,02,3,"544,500",0,"0,000"


Mi idea es que me saliera un solo registro por agrupacion y aqui me salen dos que tienes descuento y ventas, los campos en negrillas son los que agrupo.

Sinceramente no se que estoy haciendo mal.

Gracias por su colaboracion

Rogerio

Bagy 14-07-2004 01:02:08

SELECT TODO.FECHAVENTA, TODO.CODIGOCAJA, TODO.CODIGOCAJERO,
TODO.CODIGOTIPOARTICULO, SUM(TODO.CANTIDADDESCUENTO),
SUM(TODO.DESCUENTO), SUM(TODO.CANTIDADVENTAS), SUM(TODO.VENTAS)
FROM (

SELECT D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO,
0 AS CANTIDADDESCUENTO,
0.0 AS DESCUENTO,
COUNT(*) AS CANTIDADVENTAS,
SUM(D.CANTIDAD*D.PRECIOUNITARIO) AS VENTAS
FROM DetalleEncabezado D
WHERE (D.FECHAVENTA>'07/01/04')
GROUP BY D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO

UNION

SELECT D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO,
COUNT(*) AS CANTIDADDESCUENTO,
SUM(( (D.CANTIDAD*D.PRECIOUNITARIO)*(D.Descuento/100))+( (D.CANTIDAD*D.PRECIOUNITARIO)- (D.CANTIDAD*D.PRECIOUNITARIO*(D.Descuento/100)))*(D.Descuentoencabezado/100)) AS DESCUENTO,
0 AS CANTIDADVENTAS,
0.0 AS VENTAS
FROM DetalleEncabezado D
WHERE (D.FECHAVENTA>'07/01/04')
AND ((D.Descuento > 0) OR (D.descuentoencabezado>0))
GROUP BY D.FECHAVENTA, D.CODIGOCAJA, D.CODIGOCAJERO, D.CODIGOTIPOARTICULO
) TODO

jachguate 14-07-2004 01:22:24

Hola.

A ambos les recomiendo que usen la etiqueta [ sql ] para publicar sentencias, puesto que son mucho mas legibles ya que se resalta su sintaxis y es posible indentarlas.

El resutlado es como este:

Código SQL [-]
Select (*)
  from tabla;

Por otro lado, Rogerio, hay dos cosas que te falta mencionar:
  • si los queres agrupados al final, vas a sumar los campos que no son de agrupamiento, o que vas a hacer con ellos
  • Cual es tu motor de base de datos, pues la solución podria ir por varios caminos dependiendo de las capacidades de este.

hasta luego.

;)

rogeriobeltran 14-07-2004 16:33:57

Dudas con Union
 
Gracias por el consejo me ha resultado de lo mas apropiado.

Pido disculpas por mi mala utilización de las etiquetas en los próximos mensaje tratare de utilizarlas de la forma correcta.

Rogerio

rogeriobeltran 14-07-2004 18:24:39

Inconvenientes con SQL UNION
 
Buenas:

Que pena me di cuenta que la información que made estaba incompleta.

1. El motor de la Base es FireBird
2. Lo que deseo realizar es tener en un solo registros las ventas, la cantidad de ventas, el descuento y la cantidad de descuento.

Código:

SELECT FECHAVENTA, CAJA, CODIGOCAJERO,  TIPOARTICULO,
SUM(CANTIDADDESCUENTO) AS CANTIDADDESCUENTO,
SUM(DESCUENTO) AS DESCUENTO,
SUM(CANTIDADVENTAS) AS CANTIDADVENTAS,
SUM(VENTAS) AS VENTAS

FROM
 (

SELECT D.FECHAVENTA, C.NOMBRE AS CAJA, D.CODIGOCAJERO,  T.CODIGO||T.NOMBRE AS TIPOARTICULO,
0 AS CANTIDADDESCUENTO,
0.0 AS DESCUENTO,
COUNT(*) AS CANTIDADVENTAS,
SUM(D.CANTIDAD*D.PRECIOUNITARIO) AS VENTAS
FROM DetalleEncabezado D, CAJA C, TIPOARTICULO T
WHERE (D.FECHAVENTA='07/08/04')
AND (C.CODIGO=D.CODIGOCAJA)
AND (T.CODIGO=D.CODIGOTIPOARTICULO)
GROUP BY D.FECHAVENTA, C.NOMBRE, D.CODIGOCAJERO, T.CODIGO,T.NOMBRE

UNION

SELECT D.FECHAVENTA, C.NOMBRE AS CAJA, D.CODIGOCAJERO,  T.CODIGO||T.NOMBRE AS TIPOARTICULO,
COUNT(*) AS CANTIDADDESCUENTO,
SUM(( (D.CANTIDAD*D.PRECIOUNITARIO)*(D.Descuento/100))+( (D.CANTIDAD*D.PRECIOUNITARIO)- (D.CANTIDAD*D.PRECIOUNITARIO*(D.Descuento/100)))*(D.Descuentoencabezado/100)) AS DESCUENTO,
0 AS CANTIDADVENTAS,
0.0 AS VENTAS
FROM DetalleEncabezado D, CAJA C, TIPOARTICULO T
WHERE (D.FECHAVENTA='07/08/04')
AND (C.CODIGO=D.CODIGOCAJA)
AND (T.CODIGO=D.CODIGOTIPOARTICULO)
AND ((D.Descuento > 0) OR (D.descuentoencabezado>0))
GROUP BY D.FECHAVENTA, C.NOMBRE, D.CODIGOCAJERO, T.CODIGO,T.NOMBRE

)

GROUP BY FECHAVENTA, CAJA, CODIGOCAJERO,  TIPOARTICULO

Pense que con el anterior codigo tenia solucionada el inconveniente y no me presenta error de sql y me dice que es en la linea 10 en el caracter 1, es decir en el primer SELECT de la union.

Gracias por la colaboración

Rogerio

jachguate 14-07-2004 19:25:44

Cita:

Empezado por jachguate
Por otro lado, Rogerio, hay dos cosas que te falta mencionar:
  • si los queres agrupados al final, vas a sumar los campos que no son de agrupamiento, o que vas a hacer con ellos
  • Cual es tu motor de base de datos, pues la solución podria ir por varios caminos dependiendo de las capacidades de este.

Te saltaste esto...

rogeriobeltran 14-07-2004 22:50:33

Dudas con Union
 
Hola a Todos:


De pronto no me hice entender con claridad y pido disculpas:

A las pregunta que me hicieron respondo:

  • 1. El motor de la base de Datos es fireBird y el Lenguaje de Programación es Delphi.
    2. La consulta la necesito agrupadas con FechaVenta, Caja, Cajero, TipoArticulo, Calculando los valores de Descuento, Venta, Cantidades de Ventas y Cantidades Descuento


SELECT FECHAVENTA, CAJA, CODIGOCAJERO, TIPOARTICULO,
SUM(CANTIDADDESCUENTO) AS CANTIDADDESCUENTO,
SUM(DESCUENTO) AS DESCUENTO,
SUM(CANTIDADVENTAS) AS CANTIDADVENTAS,
SUM(VENTAS) AS VENTAS

FROM
(

SELECT D.FECHAVENTA, C.NOMBRE AS CAJA, D.CODIGOCAJERO, T.CODIGO||T.NOMBRE AS TIPOARTICULO,
0 AS CANTIDADDESCUENTO,
0.0 AS DESCUENTO,
COUNT(*) AS CANTIDADVENTAS,
SUM(D.CANTIDAD*D.PRECIOUNITARIO) AS VENTAS

FROM DetalleEncabezado D, CAJA C, TIPOARTICULO T

WHERE (D.FECHAVENTA='07/08/04')
AND (C.CODIGO=D.CODIGOCAJA)
AND (T.CODIGO=D.CODIGOTIPOARTICULO)

GROUP BY D.FECHAVENTA, C.NOMBRE, D.CODIGOCAJERO, T.CODIGO,T.NOMBRE

UNION


SELECT D.FECHAVENTA, C.NOMBRE AS CAJA, D.CODIGOCAJERO, T.CODIGO||T.NOMBRE AS TIPOARTICULO,
COUNT(*) AS CANTIDADDESCUENTO,
SUM(( (D.CANTIDAD*D.PRECIOUNITARIO)*(D.Descuento/100))+( (D.CANTIDAD*D.PRECIOUNITARIO)- (D.CANTIDAD*D.PRECIOUNITARIO*(D.Descuento/100)))*(D.Descuentoencabezado/100)) AS DESCUENTO,
0 AS CANTIDADVENTAS,
0.0 AS VENTAS

FROM DetalleEncabezado D, CAJA C, TIPOARTICULO T

WHERE (D.FECHAVENTA='07/08/04')
AND (C.CODIGO=D.CODIGOCAJA)
AND (T.CODIGO=D.CODIGOTIPOARTICULO)
AND ((D.Descuento > 0) OR (D.descuentoencabezado>0))

GROUP BY D.FECHAVENTA, C.NOMBRE, D.CODIGOCAJERO, T.CODIGO,T.NOMBRE

)

GROUP BY FECHAVENTA, CAJA, CODIGOCAJERO, TIPOARTICULO
Si tengo algun error de etiqueta por favor comunicarmelo y si no entiende por favor aclararla gracias

Rogerio

jachguate 14-07-2004 23:06:47

Firebird, no soporta lo que te ha sugerido Bagy, que en la jerga de Oracle se llaman Inline Views.

Lo que no me queda claro, es que al plantear la unión de los dos queryes presentados, inevitablemente habrán datos repetidos, y no especificas como queres agruparlos (sumandolos, restandolos, sacando promedio, etc).

Me llama la atención el hecho de que la segunda consulta es un subconjunto de la primera. Es decir, todo lo que arroje la segunda consulta ya estará dado en la primera (tomando en cuenta solamente los campos de agrupación expuestos, claro).

Si esto no es lo que buscas, como supongo, lo que te hace falta es excluir de la primera consulta los que devolverá la segunda.

algo como:

Código SQL [-]
  Select fechaventa, bla, bla, bla
    from DetalleEncabezado
   where fechaventa > '07/01/04'
     and not((descuento > 0) or (descuentoencabezado > 0))
union
  Select fechaventa, bla, bla, bla
    from DetalleEncabezado
   where fechaventa > '07/01/04'
     and ((descuento > 0) or (descuentoencabezado > 0))

He preferido usar el operador not, y no poner directamente la negación de la condición, que involucraría, además de comparar <= 0, que incluya los nulos (si tus campos lo permiten).

Por último, la etiqueta correcta para publicar sentencias sql es [ sql ], y no existe la etiqueta [ indent ] que has usado en tu post anterior, que lo he editado para que tenga la presentación que (supongo) esperabas porque, probablemente al cortar y pegar, has movido de lugar otras etiquetas.

hasta luego.

;)

rogeriobeltran 16-07-2004 19:18:55

Dudas con Union
 
Gracias por tu respuesta.

El problema que tengo es que tengo una tabla de factura y me piden hallar el valor de las ventas Totales, Cantidad de Facturas, El Valor de los Descuentos y cuantas facturas tienen descuento, todas estas deben estar agrupadas por Fecha, Caja, Cajero y por Tipo de Articulo, mi deseo es tener un solo registro con los datos de Fecha, Caja, Cajero, Tipo de Articulo, Valor Ventas, Cantidad de Ventas, Valor Descuento, Cantidad Descuento.

La solución que tome fue crear una tabla temporal con la consulta y sobre esta realizar una nueva consulta de agrupación por Fecha, Caja, Cajero y Tipo de Articulo y Totalizando las Ventas, Cantidad de Ventas, Descuento y Cantidad de Descuento. Esta solución sirve pero deseaba evitarme la creación de la tabla temporal.

Al momento de realizar las consulta de unión los datos que arrojan son:

Código:

Fecha          Caja Cajero Tipo CantidadDes Descuento CantidadVen Ventas
02/07/2004    1  AUX2    1        0            0        253          654710
02/07/2004    1  AUX2    1        75      5716,5      0            0

Resultado Deseado es:

Código:

Fecha            Caja Cajero Tipo CantidadDes Descuento CantidadVen Ventas
02/07/2004    1  AUX2    1        75    5716,5    253      654710

La idea es que me sume los valores en un solo registro.

Gracias por la colaboración

Rogerio

jachguate 16-07-2004 19:54:54

En ib/fb tenes dos caminos:
  • vista
    • Creas una vista "intermedia" con la unión de los dos selects.
    • Haces un select sobre la vista, haciendo un group by por cajero, etc.
  • Stored proc:
    Haces un stored proc que devuelva un cursor e internamente haga ambos selects (sin union), los sumas "a mano" y devolves ya el resumen

Hasta luego.

;)

rogeriobeltran 16-07-2004 22:30:22

Union
 
Gracias por tu colaboración,

Las observaciones han sido muy oportunas.

Hasta pronto

Rogerio


La franja horaria es GMT +2. Ahora son las 21:40:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi