vBulletin Search Engine Optimization
| |||||||
| Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| Hi, I have the following sql statement : SELECT pr.tipo_pratica, pr.versione, pr.numero_pratica, sa.prg_atto, pr.data_trasmissione, pr.tipo_atto, pr.oggetto FROM pratica pr INNER JOIN statoatto sa ON sa.tipo_pratica = pr.tipo_pratica AND sa.versione = pr.versione AND sa.numero_pratica = pr.numero_pratica AND sa.prg_atto = pr.prg_atto INNER JOIN movimenticapitolo mc ON mc.tipo_pratica = sa.tipo_pratica AND mc.versione = sa.versione AND mc.numero_pratica = sa.numero_pratica AND mc.prg_atto = sa.prg_atto INNER JOIN gruppocapitolo gc ON gc.num_capitolo = mc.numero_capitolo INNER JOIN gruppolavoro gl ON gl.id_gruppo = gc.id_gruppo INNER JOIN gruppoistruttore gi ON gi.id_gruppo = gl.id_gruppo WHERE gi.cod_fiscale = ? AND sa.cod_stato = ? AND year(pr.data_trasmissione) = ? this is the output of sql execution: tipo_pratica - versione - numero_pratica - prg_atto - data_trasmissione - tipo_atto - oggetto 001 01 200 4 2005-10-10 C MOMMMO 001 01 100 2 2005-10-30 B pluto 001 01 100 1 2005-10-29 A pippo but I want to get only the row with the max value of column sa.prg_atto for each combination of tipo_pratica + versione + numero_pratica, so the output should be the following: tipo_pratica - versione - numero_pratica - prg_atto - data_trasmissione - tipo_atto - oggetto 001 01 200 4 2005-10-10 C MOMMMO 001 01 100 2 2005-10-30 B pluto Somebody can help me? I tried many times with not success! Thank in advance. Regards Andrea |
| |||
| ahum a bit too cloudy.... if you want to have the max value from a table in your select list you may want to consider an spl. quick and dirty....eq: create procedure mymaxorder_num( f_customer_num like orders.customer_num) returning int; define retval int; let retval = -1; select max(order_num) into retval from orders where customer_num = f_customer_num; return retval; end procedure; select customer_num, lname , mymaxorder_num(customer_num) from customer Superboer if V db >= 9 then replace procedure by function. |
| |||
| The cleanest way I find is to use a view: create view max_statoatto( tipo_pratica, versione, numero_pratica, max_prg_atto ) as select tipo_pratica, versione, numero_pratica, max(prg_atto) max_prg_atto from statoatto group by 1,2,3 ; SELECT pr.tipo_pratica, pr.versione, pr.numero_pratica, sa.max_prg_atto, pr.data_trasmissione, pr.tipo_atto, pr.oggetto FROM pratica pr, max_statoatto sa, movimenticapitolo mc, gruppocapitolo gc, gruppolavoro gl, gruppoistruttore gi WHERE sa.tipo_pratica = pr.tipo_pratica AND sa.versione = pr.versione AND sa.numero_pratica = pr.numero_pratica AND sa.max_prg_atto = pr.prg_atto and mc.tipo_pratica = sa.tipo_pratica AND mc.versione = sa.versione AND mc.numero_pratica = sa.numero_pratica AND mc.prg_atto = sa.max_prg_atto and gc.num_capitolo = mc.numero_capitolo and gl.id_gruppo = gc.id_gruppo and gi.id_gruppo = gl.id_gruppo and gi.cod_fiscale = ? AND sa.cod_stato = ? AND year(pr.data_trasmissione) = ? understand that you don't create the view everytime, you just create it once and use for this query. I think I typed it up correctly but just remember that wherever you used prg_atto use max_prg_atto now. The view will of course update itself. You can also use your original inner join syntax if you want I just haven't used it alot so I think in the old school way. I keep thinking that I will play with the new syntax but I don't see any great benefit to it except if you like to type "inner join on" often. |
| ||||
| Andrea wrote: > Hi, > > I have the following sql statement : > > SELECT pr.tipo_pratica, pr.versione, pr.numero_pratica, sa.prg_atto, > pr.data_trasmissione, pr.tipo_atto, pr.oggetto > FROM pratica pr > INNER JOIN statoatto sa ON sa.tipo_pratica = pr.tipo_pratica AND > sa.versione = pr.versione AND sa.numero_pratica = pr.numero_pratica AND > sa.prg_atto = pr.prg_atto > INNER JOIN movimenticapitolo mc ON mc.tipo_pratica = sa.tipo_pratica AND > mc.versione = sa.versione AND mc.numero_pratica = sa.numero_pratica AND > mc.prg_atto = sa.prg_atto > INNER JOIN gruppocapitolo gc ON gc.num_capitolo = mc.numero_capitolo > INNER JOIN gruppolavoro gl ON gl.id_gruppo = gc.id_gruppo > INNER JOIN gruppoistruttore gi ON gi.id_gruppo = gl.id_gruppo > WHERE gi.cod_fiscale = ? AND sa.cod_stato = ? AND > year(pr.data_trasmissione) = ? <SNIP> > Somebody can help me? > I tried many times with not success! Try this: SELECT pr.tipo_pratica, pr.versione, pr.numero_pratica, sa.prg_atto, pr.data_trasmissione, pr.tipo_atto, pr.oggetto FROM pratica pr INNER JOIN statoatto sa ON sa.tipo_pratica = pr.tipo_pratica AND sa.versione = pr.versione AND sa.numero_pratica = pr.numero_pratica AND sa.prg_atto = pr.prg_atto AND sa.prg_atto = ( { This sub-query will limit the search to the maximum value of prg_atto } select max(prg_atto) from statoatto sa2 where sa2.tipo_pratica = pr.tipo_pratica AND sa2.versione = pr.versione AND sa2.numero_pratica = pr.numero_pratica ) INNER JOIN movimenticapitolo mc ON mc.tipo_pratica = sa.tipo_pratica AND mc.versione = sa.versione AND mc.numero_pratica = sa.numero_pratica AND mc.prg_atto = sa.prg_atto INNER JOIN gruppocapitolo gc ON gc.num_capitolo = mc.numero_capitolo INNER JOIN gruppolavoro gl ON gl.id_gruppo = gc.id_gruppo INNER JOIN gruppoistruttore gi ON gi.id_gruppo = gl.id_gruppo WHERE gi.cod_fiscale = ? AND sa.cod_stato = ? AND year(pr.data_trasmissione) = ? ; Art S. Kagel |