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: 27
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: 27
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: 27
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
  #9  
Antiguo 16-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 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
Responder Con Cita
  #10  
Antiguo 16-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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.

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

Gracias por tu colaboración,

Las observaciones han sido muy oportunas.

Hasta pronto

Rogerio
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 12:24:06.


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