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
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 |