Re: problem with a conditional statement

From: "Albe Laurenz" <all(at)adv(dot)magwien(dot)gv(dot)at>
To: "Kirk Wythers *EXTERN*" <kwythers(at)umn(dot)edu>
Cc: <pgsql-general(at)postgresql(dot)org>
Subject: Re: problem with a conditional statement
Date: 2007-05-09 06:33:09
Message-ID: AFCCBB403D7E7A4581E48F20AF3E5DB202960223@EXADV1.host.magwien.gv.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Kirk Wythers wrote:
>>> I am struggling to get a CASE WHEN statement to work within another
>>> CASE WHEN. Here is my original code:
>>>
>>> SELECT CASE WHEN w.station_id = site_near.station_id THEN w.obs_id
ELSE
>>> s.obs_id END AS obs_id, site_near.station_id, site_near.longname,
>>> w.year, w.doy, w.precip, w.tmin, w.tmax,
>>>
>>> --replace missing solar values (-999) with the average of all solar
>>> --values from that month (s.month)
>>>
>>> --CASE s.par WHEN -999 THEN AVG( s.par) ELSE s.par END
>>> --FROM solar s
>>> --GROUP BY s.month;
>>>
>>> FROM site_near INNER JOIN solar s ON
>>> site_near.ref_solar_station_id = s.station_id AND
>>> site_near.obs_year = s.year
>>> INNER JOIN weather w ON site_near.ref_weather_station_id =
>>> w.station_id AND site_near.obs_year = w.year AND s.date = w.date
>>> WHERE w.station_id = 211630;
>>
> Thank you for the reply. I see what you are doing in the creating of
> avgsol. That should work perfectly. However, I am unsure how you are
> working it into the existing code.

I did not provide the complete statement because
a) I am lazy and
b) I didn't want to create the impression that it was bulletproof
tested SQL :^)

> to look this like this:
>
> SELECT CASE WHEN w.station_id = site_near.station_id THEN
> w.obs_id ELSE
> s.obs_id END AS obs_id, site_near.station_id, site_near.longname,
> w.year, w.doy, w.precip, w.tmin, w.tmax,
> --replace missing values (-999) with the monthly average
> CASE s.par WHEN -999 THEN avgsol.par ELSE s.par END
>
> Correct?

Yes!

>> FROM solar s INNER JOIN ...,
>
> I can't quite figure out what you are suggesting here?
>
>> (SELECT month, AVG(par) FROM solar GROUP BY month) AS avgsol
>> WHERE s.month = avgsol.month
>> AND ...
>
> Do you mean:
>
> FROM site_near INNER JOIN solar s ON
> (SELECT month, AVG(par) FROM solar GROUP BY month) AS avgsol WHERE
> s.month = avgsol.month
> AND site_near.ref_solar_station_id = s.station_id AND
> site_near.obs_year = s.year
> INNER JOIN weather w ON site_near.ref_weather_station_id =
> w.station_id AND site_near.obs_year = w.year AND s.date = w.date
> WHERE w.station_id = 211630;
>
> I think my trouble is figuring how to place the code snipit:
>
> (SELECT month, AVG(par) FROM solar GROUP BY month) AS avgsol
> WHERE s.month = avgsol.month
> AND ...
>
> Sorry for being so dull

Sorry for being so lazy :^)

Here is a more elaborate version, I'm trying to add 'avgsol' to
your original FROM clause:

FROM site_near
INNER JOIN solar s ON
(site_near.ref_solar_station_id = s.station_id
AND site_near.obs_year = s.year)
INNER JOIN weather w ON
(site_near.ref_weather_station_id = w.station_id
AND site_near.obs_year = w.year
AND s.date = w.date)
INNER JOIN (SELECT month, AVG(par) FROM solar GROUP BY month) AS
avgsol ON
(s.month = avgsol.month)
WHERE ...

Still no claim for correctness.

Does it make more sense now?

Yours,
Laurenz Albe

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Andrej Ricnik-Bay 2007-05-09 06:38:24 Re: Views- Advantages and Disadvantages
Previous Message Ashish Karalkar 2007-05-09 04:32:32 Views- Advantages and Disadvantages