Re: Consulta compleja

From: "Jorge Vidal Martinez" <jvm(at)utenet(dot)com(dot)ar>
To: "Ricardo Fuentes Pereira" <rfuentesp(at)gmail(dot)com>
Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Consulta compleja
Date: 2005-05-31 03:43:17
Message-ID: 006301c56592$e685b4c0$869145c8@XP
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Ricardo, estas totalizado las las sx_fact_compra y las sc_fact_gastos por
RUC y luego al hacer join con las facturas y agruparlas por un atributo de
esta tabla te repite este total como tantas facturas tengas.

Intenta

SELECT
A.ruc, A.nombre ,
( COALESCE(SUM(B.valor_neto * (1 + B.valor_iva)), 0) +
COALESCE(SUM(C.valor_neto * (1 +C. valor_iva)), 0) ) AS sum_valor
FROM
sx_prov prov A
LEFT JOIN
sx_fact_compra B ON A.rut = B.rut
LEFT JOIN
sx_fact_gasto C ON A.rut = C.rut
GROUP BY
A.ruc, A.nombre

El LEFT te devuelve todas las tuplas que esten en la tabla primaria esten
o no en la secundaria..

Por lo que los proveedores que no tengan facturas de Compras o Gastos, te
aparecen en el resultado.

Saludos
Jorge

----- Original Message -----
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>
Sent: Monday, May 30, 2005 11:42 AM
Subject: Re: [pgsql-es-ayuda] Consulta compleja

> 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)
>>
>
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envíe "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
>
>
>
> --
> No virus found in this incoming message.
> Checked by AVG Anti-Virus.
> Version: 7.0.322 / Virus Database: 267.3.0 - Release Date: 30/05/2005
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Milton inostroza 2005-05-31 06:59:33 ejecutar pg_dump desde vb6 en windows
Previous Message Diego Gil 2005-05-31 02:02:55 Re: Administrador de bases de datos