help request for sql select
Posted in 2005
Topics: SQL Development & Query Writing
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
) asselect
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