Re: SQL Assistance - Mailing list pgsql-novice

From Michael Swierczek
Subject Re: SQL Assistance
Date
Msg-id CAHp1f1NDBJaYUrSCs5yaXFm-qUXNyuzVJqLC9WWSs3CHChTWNg@mail.gmail.com
Whole thread Raw
In response to SQL Assistance  (Chris Campbell <ccampbell@cascadeds.com>)
List pgsql-novice
On Wed, May 8, 2013 at 2:45 PM, Chris Campbell <ccampbell@cascadeds.com> wrote:
> Greetings,
>
>
>
> I’m struggling with a bit of SQL here and am looking for ideas on how to
> resolve it.
>
>
>
> Given the following query:
>
>
>
> Select ta.accountname, ta.appealname,
>
> coalesce(CASE WHEN ta.fk_gifttype=1 THEN Sum(ta.appealgiftamount) ELSE
> 0::decimal END,0) as pledgetotal,
>
> coalesce(CASE WHEN ta.fk_gifttype=3 THEN Sum(ta.appealgiftamount) ELSE
> 0::decimal END,0) as paymenttotal
>
> FROM ds1.tranappeal ta
>
> GROUP BY ta.accountname, ta.appealname, ta.fk_gifttype
>
> ORDER BY accountname
>
>
>
> What I want to end up with is one row per account name with the correct
> pledge and payment total.
>
>
>
> What I’m receiving in most cases is multiple lines per account name.  The
> reason is because I’m being forced to include the fk_gifttype field in the
> Group By.  Because there are other gifttype codes, those rows are being
> included with zero amounts.
>
>
>
> I also tried using a sub select but that didn’t work because “appealname”
> isn’t part of a scope.  As a result, I received the “total” pledge and
> payment regardless of appealname.
>
>
>
> I’m wonder what other options I might have to get the desired results.
>
>
>
> Thank you,
>
>
>
> Chris Campbell
>
> Cascasde Data Solutions Inc.
>
> ccampbell@cascadeds.com
>
>

This is an ugly way to do it, hopefully someone else has something better

select foo.accountname, foo.appealname, case when bar.pledgetotal is
null then 0.0 else bar.pledgetotal end as "pledgetotal",
    case when bazz.paymenttotal is null then 0 else bazz.paymenttotal
end as "paymenttotal"
from
(select distinct ta.accountname, ta.appealname from ds1.tranappeal ta
where ta.fk_gifttype in (1, 3)) foo
left join
(select ta.accountname, ta.appealname, sum(ta.appealgiftamount) as
pledgetotal from ds1.tranappeal ta
where ta.fk_gifttype = 1 GROUP BY ta.accountname, ta.appealname ) bar
on foo.accountname = bar.accountname and
foo.appealname = bar.appealname
left join
(select ta.accountname, ta.appealname, sum(ta.appealgiftamount) as
paymenttotal from ds1.tranappeal ta
where ta.fk_gifttype = 3 GROUP BY ta.accountname, ta.appealname ) bazz
on foo.accountname = bazz.accountname and foo.appealname =
bazz.appealname
ORDER BY foo.accountname

Does that help?  Hopefully someone else has something more efficient.
-Mike


pgsql-novice by date:

Previous
From: Chris Campbell
Date:
Subject: SQL Assistance
Next
From: David Raznick
Date:
Subject: Re: SQL Assistance