Search Postgresql Archives

Re: problem with a conditional statement

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux