Ir al contenido


Foto

Ayuda para montar una consulta


  • Por favor identifícate para responder
7 respuestas en este tema

#1 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 26 abril 2014 - 02:42

Hola compañeros me encuentro un poco torpe no se si es por la hora o por que aun no me he acostado, perro llevo un rato y no consigo lo que quiero y os pido ayuda para que me ayudéis a como montar la siguiente consulta.

Lo que quiero hacer es recorrer por orden de código todos los clientes, y que me diga el total de lo comprado entre unas determinadas fechas, poniéndome 0 en los que no hayan comprado nada, así de esta manera, se puede ver que clientes ya no compran o no se les ha visitado nuevamente.

La estructura de las tablas Cliente y Facturas os la detallo a continuación:

CLIENTES

CREATE TABLE CLIENTES (
    ID                INTEGER NOT NULL,
    CODIGO            CODIGO /* CODIGO = VARCHAR(20) NOT NULL */,
    NOMBRE            V80 /* V80 = VARCHAR(80) */,
    IMAGEN            IMAGEN /* IMAGEN = BLOB SUB_TYPE 0 SEGMENT SIZE 80 */,
    OBSERVACIONES      MEMO /* MEMO = BLOB SUB_TYPE 1 SEGMENT SIZE 80 */,
    FECHAALTA          FECHA /* FECHA = DATE */,
    ACTIVO            LOGIC /* LOGIC = CHAR(1) */,
    DESCUENTOMAXIMO    POR /* POR = NUMERIC(15,4) */,
    CODIGOFORMAPAGO    CODIGO /* CODIGO = VARCHAR(20) NOT NULL */,
    CODIGOIMPUESTO    CODIGO /* CODIGO = VARCHAR(20) NOT NULL */,
    DOCUMENTO          V20 /* V20 = VARCHAR(20) */,
    TIPODOCUMENTO      V20 /* V20 = VARCHAR(20) */,
    RETENCIONES        POR /* POR = NUMERIC(15,4) */,
    REQ                POR /* POR = NUMERIC(15,4) */,
    TAFIRA            INTEGER,
    DIASPRESENTACION  V20 /* V20 = VARCHAR(20) */,
    DIASCOBRO          V20 /* V20 = VARCHAR(20) */,
    AVISOS            MEMO /* MEMO = BLOB SUB_TYPE 1 SEGMENT SIZE 80 */,
    LIMITECREDITO      POR /* POR = NUMERIC(15,4) */,
    PENDIENTEPAGO      POR /* POR = NUMERIC(15,4) */,
    AGENTE            V20 /* V20 = VARCHAR(20) */,
    SECTOR            V40 /* V40 = VARCHAR(40) */,
    DIRECCION          V80 /* V80 = VARCHAR(80) */,
    CODIGOPOSTAL      V5 /* V5 = VARCHAR(5) */,
    POBLACION          V40 /* V40 = VARCHAR(40) */,
    PROVINCIA          V40 /* V40 = VARCHAR(40) */,
    PAIS              V20 /* V20 = VARCHAR(20) */,
    TELEFONO          V20 /* V20 = VARCHAR(20) */,
    FAX                V20 /* V20 = VARCHAR(20) */,
    MOVIL              V20 /* V20 = VARCHAR(20) */,
    PERSONADECONTACTO  V80 /* V80 = VARCHAR(80) */,
    WEB                V150 /* V150 = VARCHAR(150) */,
    MAIL              V80 /* V80 = VARCHAR(80) */,
    LIBRE              V80 /* V80 = VARCHAR(80) */,
    USARREQ            LOGIC /* LOGIC = CHAR(1) */,
    DISTRIBUIDOR      LOGIC /* LOGIC = CHAR(1) */
);


Y facturas

CREATE TABLE FACTURA (
    ID                  INTEGER NOT NULL,
    NUMERO              CODIGO /* CODIGO = VARCHAR(20) NOT NULL */,
    CODIGOCLIENTE        CODIGO /* CODIGO = VARCHAR(20) NOT NULL */,
    CODIGOAGENTE        CODIGO /* CODIGO = VARCHAR(20) NOT NULL */,
    TOTALCOMISION        POR /* POR = NUMERIC(15,4) */,
    CODIGOFORMAPAGO      CODIGO /* CODIGO = VARCHAR(20) NOT NULL */,
    IMPUESTO1            POR /* POR = NUMERIC(15,4) */,
    IMPUESTO2            POR /* POR = NUMERIC(15,4) */,
    IMPUESTO3            POR /* POR = NUMERIC(15,4) */,
    IMPUESTO4            POR /* POR = NUMERIC(15,4) */,
    IMPUESTO5            POR /* POR = NUMERIC(15,4) */,
    PESOTOTAL            POR /* POR = NUMERIC(15,4) */,
    SUBTOTAL            POR /* POR = NUMERIC(15,4) */,
    TOTALIMPUESTOS      POR /* POR = NUMERIC(15,4) */,
    TOTAL                POR /* POR = NUMERIC(15,4) */,
    TOTALDESCUENTOS      POR /* POR = NUMERIC(15,4) */,
    SERIE                V5 /* V5 = VARCHAR(5) */,
    NOTA                MEMO /* MEMO = BLOB SUB_TYPE 1 SEGMENT SIZE 80 */,
    FECHA                FECHA /* FECHA = DATE */,
    FECHAPAGO            FECHA /* FECHA = DATE */,
    COBRADA              LOGIC /* LOGIC = CHAR(1) */,
    RECARGOEQUIVALENCIA  POR /* POR = NUMERIC(15,4) */,
    LIBRE                V80 /* V80 = VARCHAR(80) */,
    PENDIENTECOBRO      POR /* POR = NUMERIC(15,4) */,
    RF                  V20 /* V20 = VARCHAR(20) */
);


El que los clientes que no hyan comprado entre las fechas dadas lo ponga a 0 es importante, ya que en el grid, los marcara en rojo, mientras que al resto en verde.

Claro esta que mejor si sólo aparece un registro por cliente con el total de todas las facturas que tenga en ese mes

Desde ya os doy las gracias, ahora me voy a dormir.

P.D. Creí colocarlo de madrugada pero estoy tan torpe que no debí darle a publicarlos
  • 0

#2 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 26 abril 2014 - 05:48

Hola compañeros, de momento tengo la siguiente consulta

SELECT
  CLIENTES.CODIGO,
  CLIENTES.NOMBRE,
  FACTURA.NUMERO,
  FACTURA.SERIE,
  FACTURA.FECHA,
  FACTURA.CODIGOAGENTE,
  EMPLEADOS.NOMBRE,
  FACTURA.TOTAL,
  FACTURA.COBRADA
FROM
CLIENTES
INNER JOIN FACTURA ON (CLIENTES.CODIGO=FACTURA.CODIGOCLIENTE)
INNER JOIN EMPLEADOS ON (FACTURA.CODIGOAGENTE=EMPLEADOS.CODIGO)
WHERE
  (FACTURA.FECHA BETWEEN '04/01/2014' AND '04/30/2014')
ORDER BY
  CLIENTES.ID




Pero esta sólo me da los clientes que han comprado, en en esas fechas, y además me da un registro por cada factura, cuando lo que quiero, es que si el cliente no ha comprado, rellene el total con un 0 y además totalice todas las facturas en un sólo registro, sigo trabajando en ello, si voy consiguiendo algo más lo iré publicando
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 26 abril 2014 - 01:19

Hola.

Por lo que dices parece que lo más indicado en ese caso es una subconsulta.



delphi
  1. SELECT
  2.   CODIGO,
  3.   NOMBRE,
  4.   (SELECT SUM(TOTAL)
  5.   FROM FACTURA
  6.   WHERE CODIGOCLIENTE = CODIGO AND
  7.               FECHA BETWEEN '04/01/2014' AND '04/30/2014'
  8.   ) AS TOTAL
  9. FROM
  10. CLIENTES
  11. ORDER BY
  12.   CLIENTES.ID


  • 0

#4 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 26 abril 2014 - 02:21

Mark muy bueno, sólo una cosa más como hago para que no queden en blanco sino  con u 0
  • 0

#5 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 26 abril 2014 - 04:57

Hola
A mi me gusta usar iif() en casos como este.
He usado varios en una sola consulta y funcionan muy bien. (y)
Aqui esta el ejemplo de firebird.
Saludos
  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 26 abril 2014 - 06:25

Mark muy bueno, sólo una cosa más como hago para que no queden en blanco sino  con u 0




delphi
  1. SELECT
  2.   CODIGO,
  3.   NOMBRE,
  4.   COALESCE( (SELECT SUM(TOTAL)
  5.   FROM FACTURA
  6.   WHERE CODIGOCLIENTE = CODIGO AND
  7.               FECHA BETWEEN '04/01/2014' AND '04/30/2014'
  8.   ), 0) AS TOTAL
  9. FROM
  10. CLIENTES
  11. ORDER BY
  12.   CLIENTES.ID



COALESCE(x, y) te da X si no es null, y te da Y cuando X es null.
  • 0

#7 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 27 abril 2014 - 12:42

Gracias a todos, aunque en un principio pensaba en otra cosa , que era que al mostrar el grid, los registros se mostrarán con tres colores, verde los que han comprado y pagado, crema, los que han comprado y tienen las facturas aun por pagar y por último en rojo los que no han comprado  al final, como bien me corrigieron, teniendo toda la razón, ya que  si quiero totalizar las ventas por cliente, no podía pedir detalles de la misma, por lo que descarto las no cobradas, simplemente, así que la consulta que monto Marc y el retoque que le dio Sergio, han sido, perfectos, muchas gracias.
  • 0

#8 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 28 abril 2014 - 07:03

Solo para aclarar y aportar algo Desart.
INNER JOIN Solo te mostrará aquellas filas en las que los campos de relación no sean nulos y si mal no entiendo este es el caso de aquellos clientes que no han comprado. Por lo tanto te podrías servir de LEFT JOIN que te incluirá aquellos clientes que no hayan comprado.
Esto no tiene que ver con la solución, es solo para que lo pruebes. Ya que no incluye los totales.
Por otra parte, te recomiendo que normalices la tabla de clientes, pues te quedará enorme debido a la redundancia.
Saludos.

  • 0




IP.Board spam blocked by CleanTalk.