ACCESS 2003 - Query max da due tabelle

martedì 07 giugno 2011 - 16.07
Tag Elenco Tags  Access (.mdb)  |  Office 2003

AJet Profilo | Newbie

Ciaoa tutti! Ho un altro problema da sottoporvi.
Penso sia una cosa abbastanza semplice da implementare, il problema è che i miei ricordi di sql sono molto fumosi e remoti, quindi non so come mettere tutto assieme in un'unica query.

Allora, ho due diverse tabelle:
tabella Sessioni, con campi ID_PAZIENTE, N_SESSIONE (entrambi numerici) e altri non rilevanti
tabella Sessioni_interrotte, con campi ID_PAZIENTE, N_SESSIONE (entrambi numerici) e altri non rilevanti

Io ho bisogno di creare una query che, controllate entrambe le tabelle, mi estragga per lo specifico paziente, il massimo valore di N_SESSIONE disponibile.

Spero possiate aiutarmi!
Grazie sin d'ora!
Ciao!

dinoxet Profilo | Senior Member

>tabella Sessioni, con campi ID_PAZIENTE, N_SESSIONE (entrambi numerici) e altri non rilevanti
>tabella Sessioni_interrotte, con campi ID_PAZIENTE, N_SESSIONE (entrambi numerici) e altri non rilevanti

>Io ho bisogno di creare una query che, controllate entrambe le tabelle, mi estragga per lo specifico paziente, il massimo valore di N_SESSIONE disponibile.

select sessioni.id_paziente, max(sessioni.n_sessione) massimosessione,max(sessioni_interrotte.n_sessione) massimosessioneinterrotte
from
sessioni inner join sessioni_interrotte on sessioni.id_paziente = sessioni_interrotte.id_paziente


>Grazie sin d'ora!
prego
>Ciao!
ciao

DINOXET
__________________________________________
impossible is only a word

AJet Profilo | Newbie

>select sessioni.id_paziente, max(sessioni.n_sessione) AS massimosessione,max(sessioni_interrotte.n_sessione) AS
>massimosessioneinterrotte
>from
>sessioni inner join sessioni_interrotte on sessioni.id_paziente = sessioni_interrotte.id_paziente

Se ho ben capito, dovrebbe rendere dei record di 3 campi: id del paziente, il suo max della tabella sessioni e il suo max della tabella sessioni_interrotte.

Non è proprio quel che serviva a me, in effetti. Io vorrei un solo valore, il massimo di entrambe le tabelle. Per esempio, se considero il paziente con id = 1 (gli imposto in coda alla query la condizione "where id_paziente = 1") questo ha svolto un tot di sessioni e ne ha interrotte un altro tot. Se in corrispondenza di questo id c'è come massimo numero di sessione 31 nella prima tabella e 435 nell'altra, voglio che il risultato della query sia semplicemente 435.

Ma in ogni caso la query che mi hai suggerito purtroppo non gira (ho aggiunto gli AS che vedi nella query, ma non funziona lo stesso)

L'errore che mi visualizza è "impossibile eseguire una query che non include l'espressione id_paziente specificata come parte di una funzione di aggregazione".

dinoxet Profilo | Senior Member

select sessioni.id_paziente,CASE WHEN max(sessioni.n_sessione) > max(sessioni_interrotte.n_sessione) then max(sessioni.n_sessione) else max(sessioni_interrotte.n_sessione) end AS
massimosessione
from
sessioni inner join sessioni_interrotte on sessioni.id_paziente = sessioni_interrotte.id_paziente
group by sessioni.id_paziente

prova così dovrebbe funzionare


DINOXET
__________________________________________
impossible is only a word

lbenaglia Profilo | Guru

>Io ho bisogno di creare una query che, controllate entrambe le
>tabelle, mi estragga per lo specifico paziente, il massimo valore
>di N_SESSIONE disponibile.

Ciao,

Potresti risolvere con l'operatore UNION che esegue l'unione di due result set ed eseguendo l'aggregazione sul result set risultante.
Ti allego uno script in T-SQL per SQL Server ma troverai anche una soluzione compatibile con JET (il motore relazionale utilizzato da Access):

USE tempdb; CREATE TABLE dbo.Sessioni( ID_PAZIENTE int NOT NULL, N_SESSIONE int NOT NULL ); CREATE TABLE dbo.Sessioni_interrotte( ID_PAZIENTE int NOT NULL, N_SESSIONE int NOT NULL ); INSERT dbo.Sessioni VALUES (1, 10), (2, 20), (3, 30); INSERT dbo.Sessioni_interrotte VALUES (1, 100), (2, 15), (3, 30), (4, 40); /* Soluzione per SQL Server 2005+ basata su una CTE */ WITH CTE_Sessioni AS ( SELECT ID_PAZIENTE, N_SESSIONE FROM dbo.Sessioni UNION SELECT ID_PAZIENTE, N_SESSIONE FROM dbo.Sessioni_interrotte ) SELECT ID_PAZIENTE, MAX(N_SESSIONE) AS SessioneMassima FROM CTE_Sessioni GROUP BY ID_PAZIENTE; /* Soluzione compatibile con JET basata su una tabella derivata */ SELECT ID_PAZIENTE, MAX(N_SESSIONE) AS SessioneMassima FROM ( SELECT ID_PAZIENTE, N_SESSIONE FROM dbo.Sessioni UNION SELECT ID_PAZIENTE, N_SESSIONE FROM dbo.Sessioni_interrotte ) AS Q GROUP BY ID_PAZIENTE; /* Output: ID_PAZIENTE SessioneMassima ----------- --------------- 1 100 2 20 3 30 4 40 (4 row(s) affected) */ DROP TABLE dbo.Sessioni, dbo.Sessioni_interrotte;

>Grazie sin d'ora!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

lbenaglia Profilo | Guru

>select sessioni.id_paziente,CASE WHEN max(sessioni.n_sessione)
>> max(sessioni_interrotte.n_sessione) then max(sessioni.n_sessione)
>else max(sessioni_interrotte.n_sessione) end AS
>massimosessione
>from
>sessioni inner join sessioni_interrotte on sessioni.id_paziente
>= sessioni_interrotte.id_paziente
>group by sessioni.id_paziente
>
>prova così dovrebbe funzionare
Ne dubito per 2 motivi:

1) JET non ammette l'espressione CASE (che parzialmente può essere sostituita dalla funzione IIF());
2) La query considera solo gli id_paziente comuni alle due tabelle ignorando gli altri.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

AJet Profilo | Newbie

Ciao ragazzi! Grazie dei suggerimenti!

Stavo provando giusto ora a far girare il codice di Dinoxet. Effettivamente, così com'è non funziona, perché Access non riconosce il CASE. Scoperto che lo statement "sostituto" è iif, stavo già frugando sul web per capire come usarlo. Ma visto che dopo qualche minuto Lorenzo ha scritto, mi sono potuta risparmiare la fatica, perché questa sua query:

>/* Soluzione compatibile con JET basata su una
> tabella derivata
>*/
>SELECT ID_PAZIENTE, MAX(N_SESSIONE) AS SessioneMassima
>FROM (
> SELECT ID_PAZIENTE, N_SESSIONE
> FROM dbo.Sessioni
> UNION
> SELECT ID_PAZIENTE, N_SESSIONE
> FROM dbo.Sessioni_interrotte
>) AS Q
>GROUP BY ID_PAZIENTE;

funziona alla perfezione (mannaggia all'union, che nemmeno mi ricordavo esistesse! Pensavo di dover fare un mega-mosaico di parentesi... E non mi ci raccapezzavo! :D )

Quindi grazie ad entrambi, ma in particolare a Lorenzo, che mi ha risolto il problema alla grande!

A tal proposito, Lorenzo, se qui sul forum esistono "ricompense" tipo karma, ringraziamenti, pollici alti ecc. fammelo sapere, perché te li meriti! ;)

lbenaglia Profilo | Guru

>A tal proposito, Lorenzo, se qui sul forum esistono "ricompense"
>tipo karma, ringraziamenti, pollici alti ecc. fammelo sapere,
>perché te li meriti! ;)
Guarda, non credo esistano ricompense virtuali, ma puoi sempre offrirmi una cenetta come si deve

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

AJet Profilo | Newbie

>Guarda, non credo esistano ricompense virtuali, ma puoi sempre
>offrirmi una cenetta come si deve

Aggiudicato! ...Ma solo solo in un ristorante in cui accettano ordinazioni in sql:
"select pizza from menu where farcitura = 'tonno' UNION select bevanda from lista where name='coca' "
...E per ordinazioni più complesse lascio fare a te!

Oddio, sto sclerando... Forse per stasera è meglio che smetta di programmare!

Buona serata!

lbenaglia Profilo | Guru

>>Guarda, non credo esistano ricompense virtuali, ma puoi sempre
>>offrirmi una cenetta come si deve
>
>Aggiudicato! ...Ma solo solo in un ristorante in cui accettano
>ordinazioni in sql:
>"select pizza from menu where farcitura = 'tonno' UNION select
>bevanda from lista where name='coca' "
>...E per ordinazioni più complesse lascio fare a te!
OK, anche perché la coca mi fa male, preferisco una classica birra media

>Oddio, sto sclerando... Forse per stasera è meglio che smetta
>di programmare!
>
>Buona serata!
Anche a te.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5