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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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