I think that you are really headed down the wrong path with your stored procedure solution. This will end in tears and frustration. Even if it does eventually work.
Two important questions:
Is your list of stations static enough that you would be willing to change the query if there is a change in the stations?
Do you always want to see all the data for all the stations?
If the answer to both questions is "yes," then there is a way to do a kind of false cross-tab in SQL. However, all of the column headings are hard-coded. So, you have to manually go in and change it if the list of stations changes.
The key to this solution is the CASE function. Your SQL would start something like:
SELECT date1, time1,
(CASE Station_id WHEN "Station1" THEN today_rain ELSE 0 END) AS Station1_Today,
(CASE Station_id WHEN "Station2" THEN today_rain ELSE 0 END) AS Station2_Today,
(CASE Station_id WHEN "Station3" THEN today_rain ELSE 0 END) AS Station3_Today
You can either sum your columns in the SQL statement (generally the preferred method, as otherwise you see a LOT of zeroes), or in Crystal, grouping by your date and time values.