From: | Ricardo Fuentes Pereira <rfuentesp(at)gmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)surnet(dot)cl> |
Cc: | 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:33:49 |
Message-ID: | 429B244D.3010807@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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
From | Date | Subject | |
---|---|---|---|
Next Message | Roberto Cesar Najera | 2005-05-30 14:39:51 | Re: respaldos |
Previous Message | Alejandro Romero Parra | 2005-05-30 14:23:10 | Re: Obteniendo informacion de 3 tablas en forma de columnas y no renglones. (Vista, Procedimiento Almacenado o consulta sencilla?). |