help request for sql select

help request for sql select

Post by Andre » Mon, 31 Oct 2005 18:43:53


his is a multi-part message in MIME format.


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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.3790.373" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Hi,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>I have the following sql statement :</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>SELECT pr.tipo_pratica, pr.versione,
pr.numero_pratica, sa.prg_atto, pr.data_trasmissione, pr.tipo_atto,
pr.oggetto<BR>FROM pratica pr  <BR>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<BR>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<BR>INNER JOIN gruppocapitolo gc ON gc.num_capitolo =
mc.numero_capitolo <BR>INNER JOIN gruppolavoro gl ON gl.id_gruppo = gc.id_gruppo
<BR>INNER JOIN gruppoistruttore gi ON gi.id_gruppo = gl.id_gruppo <BR>WHERE
gi.cod_fiscale = ? AND sa.cod_stato = ? AND year(pr.data_trasmissione) =
?</FONT></DIV>
<DIV><FONT face=Arial size=2><
 
 
 

help request for sql select

Post by Superboe » Tue, 01 Nov 2005 18:44:09

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.

 
 
 

help request for sql select

Post by bozo » Fri, 04 Nov 2005 01:44:28

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.
 
 
 

help request for sql select

Post by Art S. Kag » Fri, 04 Nov 2005 08:14:30


<SNIP>

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