Skip site navigation (1) Skip section navigation (2)

Re: Consulta compleja

From: Ricardo Fuentes Pereira <rfuentesp(at)gmail(dot)com>
To: Ricardo Fuentes Pereira <rfuentesp(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)surnet(dot)cl>,Jorge Vidal Martinez <jvm(at)utenet(dot)com(dot)ar>,pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta compleja
Date: 2005-05-30 14:42:13
Message-ID: 429B2645.2070109@gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Ups. Reenviado por algunos errores.

Ok. Tienes razon.
Voy a explicarme mejor.
Tengo las siguientes tablas:

-- Para proveedores
CREATE TABLE sx_prov
(
 rut varchar(10) NOT NULL,
 nombre varchar(255) NOT NULL,
 CONSTRAINT sx_prov_pkey PRIMARY KEY (rut)
)


-- Para facturas de compra
CREATE TABLE sx_fact_compra
(
 num_fact int4 NOT NULL,
 rut varchar(10) NOT NULL,
 valor_neto float8 NOT NULL,
 valor_iva float8 NOT NULL,
 CONSTRAINT sx_fact_compra_pkey PRIMARY KEY (num_fact),
 CONSTRAINT sx_fact_compra_rut_fkey FOREIGN KEY (rut) REFERENCES sx_prov 
(rut) ON UPDATE RESTRICT ON DELETE RESTRICT
)


-- Para facturas de gasto
CREATE TABLE sx_fact_gasto
(
 num_fact int4 NOT NULL,
 rut varchar(10) NOT NULL,
 valor_neto float8 NOT NULL,
 valor_iva float8 NOT NULL,
 CONSTRAINT sx_fact_gasto_pkey PRIMARY KEY (num_fact),
 CONSTRAINT sx_fact_gasto_rut_fkey FOREIGN KEY (rut) REFERENCES sx_prov 
(rut) ON UPDATE RESTRICT ON DELETE RESTRICT
)

Supongamos los siguientes datos:
sx_prov
rut                 |    nombre
11111111-1        Ricardo
22222222-2        Andres

sx_fact_compra
num_fact   |   rut               |   valor_neto   |   valor_iva 
1                   11111111-1     150                  0.19
2                   11111111-1     250                  0.19
3                   22222222-2     50                    0.19
4                   22222222-2     300                  0.19

sx_fact_gasto
num_fact   |   rut               |   valor_neto   |   valor_iva 
1                   11111111-1     100                  0.19
2                   11111111-1     200                  0.19


Necesito saber cuanto le he comprado a un proveedor. Ahi la consulta la 
realice como mostre en el mail anterior.

.. inicio codigo

SELECT *
FROM (
   SELECT  prov.rut, prov.nombre
       (fact_compra.sum_valor_fc + fact_gasto.sum_valor_fg) AS sum_valor
   FROM sx_prov prov,
        -- fact_compra
        -- recorro la tabla sx_fact_compra segun el rut
        -- para obtener a cuanto ascienden las factura de compra
        (
           SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS 
sum_valor_fc
           FROM sx_fact_compra
           WHERE rut = '11111111-1'
        ) AS fact_compra,
        -- fact_gasto
        -- analogo a la sx_fact_compra
        (
           SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS 
sum_valor_fg
           FROM sx_fact_gasto
           WHERE rut = '11111111-1'
        ) AS fact_gasto
     WHERE prov.rut = '11111111-1'
     GROUP BY
        prov.rut, prov.nombre, fact_compra.sum_valor_fc, 
fact_compra.sum_valor_fg
) AS tabla

Y me devuelve:
rut                |   nombre      |   sum_valor
11111111-1      Ricardo            833

Lo cual esta correcto.

Pero cuando quiero mostrar varios registros/filas para distintos 
proveedores, lo intente hacerlo asi:

.. inicio codigo

SELECT *
FROM (
   SELECT  prov.rut, prov.nombre
       (fact_compra.sum_valor_fc + fact_gasto.sum_valor_fg) AS sum_valor
   FROM sx_prov prov,
        -- fact_compra
        -- recorro la tabla sx_fact_compra segun el rut
        -- para obtener a cuanto ascienden las factura de compra
        (
           SELECT rut, COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS 
sum_valor_fc
           FROM sx_fact_compra
           GROUP BY  rut
        ) AS fact_compra,
        -- fact_gasto
        -- analogo a la sx_fact_compra
        (
           SELECT rut, COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS 
sum_valor_fg
           FROM sx_fact_gasto
           GROUP BY  rut
        ) AS fact_gasto
     WHERE prov.rut = fact_compra.rut
        AND    prov.rut = fact_gasto.rut
     GROUP BY
        prov.rut, prov.nombre, fact_compra.sum_valor_fc, 
fact_compra.sum_valor_fg
) AS tabla

Lo cual devuelve:
rut                |   nombre      |   sum_valor
11111111-1      Ricardo            833

Donde faltaria el registro para el rut 22222222-2, pues no tiene datos. 
¿Que podria hacer en  este caso?

Aunque intente reproducir el error de las sumas erroneas, donde para 
algunos proveedores sumaba varias veces los montos de las facturas, no 
pude (Es que lo hice hace tiempo)

Espero haber sido mas explicativo.

Saludos



Ricardo Fuentes Pereira escribió:

> Alvaro Herrera escribió:
>
>> Yo encontre la pregunta falta de los detalles suficientes como para
>> poder responderla.  Digo, al menos deberia mostrarnos unas definiciones
>> de tablas que se puedan usar para probar, no?  Y una consulta que
>> realmente funcione, no a medias con "aqui deberia ir tal cosa", que
>> encima de todo tenemos que adivinar de que se trata.
>>  
>>
> Ok. Tienes razon.
> Voy a explicarme mejor.
> Tengo las siguientes tablas:
>
> -- Para proveedores
> CREATE TABLE sx_prov
> (
>  rut varchar(10) NOT NULL,
>  nombre varchar(255) NOT NULL,
>  CONSTRAINT sx_prov_pkey PRIMARY KEY (rut)
> )
>
>
> -- Para facturas de compra
> CREATE TABLE sx_fact_compra
> (
>  num_fact int4 NOT NULL,
>  rut varchar(10) NOT NULL,
>  valor_neto float8 NOT NULL,
>  valor_iva float8 NOT NULL,
>  CONSTRAINT sx_fact_compra_pkey PRIMARY KEY (num_fact),
>  CONSTRAINT sx_fact_compra_rut_fkey FOREIGN KEY (rut) REFERENCES 
> sx_prov (rut) ON UPDATE RESTRICT ON DELETE RESTRICT
> )
>
>
> -- Para facturas de gasto
> CREATE TABLE sx_fact_gasto
> (
>  num_fact int4 NOT NULL,
>  rut varchar(10) NOT NULL,
>  valor_neto float8 NOT NULL,
>  valor_iva float8 NOT NULL,
>  CONSTRAINT sx_fact_gasto_pkey PRIMARY KEY (num_fact),
>  CONSTRAINT sx_fact_gasto_rut_fkey FOREIGN KEY (rut) REFERENCES 
> sx_prov (rut) ON UPDATE RESTRICT ON DELETE RESTRICT
> )
>
> Supongamos los siguientes datos:
> sx_prov
> rut                 |    nombre
> 11111111-1        Ricardo
> 22222222-2        Andres
>
> sx_fact_compra
> num_fact   |   rut               |   valor_neto   |   valor_iva  
> 1                   11111111-1     150                  0.19
> 1                   11111111-1     250                  0.19
> 1                   22222222-2     50                    0.19
> 1                   22222222-2     300                  0.19
>
> sx_fact_gasto
> num_fact   |   rut               |   valor_neto   |   valor_iva  
> 1                   11111111-1     100                  0.19
> 1                   11111111-1     200                  0.19
>
>
> Necesito saber cuanto le he comprado a un proveedor. Ahi la consulta 
> la realice como mostre en el mail anterior.
>
> .. inicio codigo
>
> SELECT *
> FROM (
>    SELECT  prov.rut, prov.nombre
>        (fact_compra.sum_valor_fc + fact_gasto.sum_valor_fg) AS sum_valor
>    FROM sx_prov prov,
>         -- fact_compra
>         -- recorro la tabla sx_fact_compra segun el rut
>         -- para obtener a cuanto ascienden las factura de compra
>         (
>            SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS 
> sum_valor_fc
>            FROM sx_fact_compra
>            WHERE rut = '11111111-1'
>         ) AS fact_compra,
>         -- fact_gasto
>         -- analogo a la sx_fact_compra
>         (
>            SELECT COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) AS 
> sum_valor_fg
>            FROM sx_fact_gasto
>            WHERE rut = '11111111-1'
>         ) AS fact_gasto
>      WHERE prov.rut = '11111111-1'
>      GROUP BY
>         prov.rut, prov.nombre, fact_compra.sum_valor_fc, 
> fact_compra.sum_valor_fg
> ) AS tabla
>
> Y me devuelve:
> rut                |   nombre      |   sum_valor
> 11111111-1      Ricardo            833
>
> Lo cual esta correcto.
>
> Pero cuando quiero mostrar varios registros/filas para distintos 
> proveedores, lo intente hacerlo asi:
>
> .. inicio codigo
>
> SELECT *
> FROM (
>    SELECT  prov.rut, prov.nombre
>        (fact_compra.sum_valor_fc + fact_gasto.sum_valor_fg) AS sum_valor
>    FROM sx_prov prov,
>         -- fact_compra
>         -- recorro la tabla sx_fact_compra segun el rut
>         -- para obtener a cuanto ascienden las factura de compra
>         (
>            SELECT rut, COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) 
> AS sum_valor_fc
>            FROM sx_fact_compra
>            GROUP BY  rut
>         ) AS fact_compra,
>         -- fact_gasto
>         -- analogo a la sx_fact_compra
>         (
>            SELECT rut, COALESCE(SUM(valor_neto * (1 + valor_iva)), 0) 
> AS sum_valor_fg
>            FROM sx_fact_gasto
>            GROUP BY  rut
>         ) AS fact_gasto
>      WHERE prov.rut = fact_compra.rut
>         AND    prov.rut = fact_gasto.rut
>      GROUP BY
>         prov.rut, prov.nombre, fact_compra.sum_valor_fc, 
> fact_compra.sum_valor_fg
> ) AS tabla
>
> Lo cual devuelve:
> rut                |   nombre      |   sum_valor
> 11111111-1      Ricardo            833
>
> Donde faltaria el registro para el rut 22222222-2, pues no tiene 
> datos. ¿Que podria hacer en  este caso?
>
> Aunque intente reproducir el error de las sumas erroneas, donde para 
> algunos proveedores sumaba varias veces los montos de las facturas, no 
> pude (Es que lo hice hace tiempo)
>
> Espero haber sido mas explicativo.
>
> Saludos
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 2: puedes desuscribirte de todas las listas simultáneamente
>    (envíe "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
>


In response to

Responses

pgsql-es-ayuda by date

Next:From: Roberto Cesar NajeraDate: 2005-05-30 14:54:13
Subject: Re: lc_messages en Debian
Previous:From: Roberto Cesar NajeraDate: 2005-05-30 14:39:51
Subject: Re: respaldos

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group