Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-07-2004
rogeriobeltran rogeriobeltran is offline
Miembro
 
Registrado: dic 2003
Ubicación: Bucaramanga-Santander-Colombia
Posts: 49
Poder: 0
rogeriobeltran Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 14-07-2004
Bagy Bagy is offline
Registrado
 
Registrado: jun 2004
Posts: 9
Poder: 0
Bagy Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 14-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 14-07-2004
rogeriobeltran rogeriobeltran is offline
Miembro
 
Registrado: dic 2003
Ubicación: Bucaramanga-Santander-Colombia
Posts: 49
Poder: 0
rogeriobeltran Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 14-07-2004
rogeriobeltran rogeriobeltran is offline
Miembro
 
Registrado: dic 2003
Ubicación: Bucaramanga-Santander-Colombia
Posts: 49
Poder: 0
rogeriobeltran Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 14-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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...
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 14-07-2004
rogeriobeltran rogeriobeltran is offline
Miembro
 
Registrado: dic 2003
Ubicación: Bucaramanga-Santander-Colombia
Posts: 49
Poder: 0
rogeriobeltran Va por buen camino
Cool 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

Última edición por jachguate fecha: 14-07-2004 a las 22:55:34.
Responder Con Cita
  #8  
Antiguo 14-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 07:02:42.


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
Copyright 1996-2007 Club Delphi