Solution found ! Re: Need help with embedded CASEs
От | Denis Bucher |
---|---|
Тема | Solution found ! Re: Need help with embedded CASEs |
Дата | |
Msg-id | 5.1.0.14.0.20011108120107.03333ec0@mail.niftycom.com обсуждение исходный текст |
Ответ на | Need help with embedded CASEs (Denis Bucher <dbucher@niftycom.com>) |
Список | pgsql-sql |
At 16:58 07.11.01 +0100, you wrote: Hello ! I think it is a bug or at least an unimplemented feature of Postgres 7.1... >Here is a simplified version of the problem that I have : >SELECT CASE WHEN '2001-11-07' = current_date THEN 't' ELSE 'f' END AS >flag_today, CASE WHEN flag_today THEN current_time ELSE '00:00' END AS >time_iftoday; Conclusion it doesn't work to use a newly created column in a CASE And the solution are : a) replace the field by the complete expression (can become very complex) b) do sub-request : The erroneous sql query was : SELECT sc.datetime_deliver, SUM( CASE WHEN sc.type_cmd=1 AND b.b='TRUE' THEN sl.number_main WHEN sc.type_cmd=4 AND b.b='TRUE' AND true_nb_shop=sc.nb_shop_main THEN sl.number_main ELSE '0' END ) AS sum_nb_entre, CASE WHEN sc.type_cmd=1 AND b.b='TRUE' THEN sc.nb_shop_main WHEN sc.type_cmd=3 AND b.b='TRUE' THEN sc.nb_shop_other WHEN sc.type_cmd=4 AND b.b='TRUE' THEN sc.nb_shop_main WHEN sc.type_cmd=4 AND b.b='FALSE' THEN sc.nb_shop_other ELSE '0' END AS true_nb_shop, SUM( CASE WHEN sc.type_cmd=3 AND b.b='TRUE' THEN sl.number_other+sl.number_trash+sl.number_eaten WHEN sc.type_cmd=4 AND b.b='FALSE' THEN sl.number_other ELSE '0' END ) AS sum_nb_sorti FROM stock_cmd sc, stock_lig sl, (SELECT boolean 'TRUE' AS b UNION SELECT 'FALSE') as b WHERE sc.datetime_deliver BETWEEN '2001-01-01 11:00:00' AND '2002-01-01 12:00:00' AND sc.type_cmd<>2 AND sl.id_cmd=sc.id AND (sc.type_cmd=4 OR b.b='TRUE') GROUP BY sc.datetime_deliver, true_nb_shop I change it into : SELECT vi.datetime_deliver, vi.true_nb_shop, SUM( CASE WHEN vi.type_cmd=1 AND vi.b='TRUE' THEN vi.number_main WHEN vi.type_cmd=4 AND vi.b='TRUE' AND vi.true_nb_shop=vi.nb_shop_main THEN vi.number_main ELSE '0' END ) AS sum_nb_entre, SUM( CASE WHEN vi.type_cmd=3 AND vi.b='TRUE' THEN vi.number_other+vi.number_trash+vi.number_eaten WHEN vi.type_cmd=4 AND vi.b='FALSE' THEN vi.number_other ELSE '0' END ) AS sum_nb_sorti FROM (SELECT sc.type_cmd, b.b, sl.number_main, sl.number_other, sl.number_trash, sl.number_eaten, sc.nb_shop_main, sc.datetime_deliver, CASE WHEN sc.type_cmd=1 AND b.b='TRUE' THEN sc.nb_shop_main WHEN sc.type_cmd=3 AND b.b='TRUE' THEN sc.nb_shop_other WHEN sc.type_cmd=4 AND b.b='TRUE' THEN sc.nb_shop_main WHEN sc.type_cmd=4 AND b.b='FALSE' THEN sc.nb_shop_other ELSE '0' END AS true_nb_shop FROM stock_cmd sc, stock_lig sl, (SELECT boolean 'TRUE' AS b UNION SELECT 'FALSE') as b WHERE sc.datetime_deliver BETWEEN '2001-01-01 11:00:00' AND '2002-01-01 12:00:00' AND sc.type_cmd<>2 AND sl.id_cmd=sc.id AND (sc.type_cmd=4 OR b.b='TRUE')) AS vi GROUP BY vi.datetime_deliver, vi.true_nb_shop And it's great ! It seems to work ;-)) Thanks to all that helped me and gave me the solution ! Denis Bucher NiftyCom
В списке pgsql-sql по дате отправления: