Domanda sulle query di access

lunedì 31 luglio 2006 - 11.39

roberto77mds Profilo | Newbie

ciao a tutti

Volevo chiedere questo: io ho bisogno di fare una query (intersecando 2 tabelle) e fin qui non ci sono problemi. La relazione che mi da è uno a molti perchè in effetti il valore che relaziono è per una tabella univoco, mentre nella seconda tabella non lo è (quindi possono unoesserci più record con quel valore). A me interesserebbe però avere nella query solo un record per valore.

Faccio un esempio. Sono in un labaoratorio analisi. Ho una tabella con tutti i pazienti (quelli per cui ho fatto almeno un esame). Voglio monitorare i pazienti che hanno fatto l'esame XXY per sapere quanti sono positivi e quanti negativi. Se unisco le due tabelle PAZIENTI ed ESAME XXY, mi viene fuori una query dove i pazienti che hanno fatto più di una volta quell'esame hanno un numeor di record pari al numero di volte che si sono sottoposti a quell'esame. A me interessa, in questi casi, che la mia query mi visualizzi solo 1 record per paziente con l'esito dell'esame più recente. Mi puoi dare qualche idea?

saluti

roberto

lbenaglia Profilo | Guru

>A me interessa, in questi casi, che la mia query
>mi visualizzi solo 1 record per paziente con l'esito dell'esame
>più recente. Mi puoi dare qualche idea?

Ciao Roberto,

ti allego questo esempio in T-SQL per SQL Server, ma la stessa query puoi utilizzarla in Access:

USE tempdb; GO CREATE TABLE dbo.Pazienti( PazienteID int NOT NULL PRIMARY KEY, Nome varchar(10) NOT NULL, Cognome varchar(10) NOT NULL ); GO CREATE TABLE dbo.Esami( EsameID int NOT NULL PRIMARY KEY, PazienteID int NOT NULL, Esame varchar(20) NOT NULL, Data datetime NOT NULL, CONSTRAINT FK_Esami_Pazienti FOREIGN KEY(PazienteID) REFERENCES dbo.Pazienti(PazienteID) ); GO INSERT dbo.Pazienti VALUES(1, 'Lorenzo', 'Benaglia'); INSERT dbo.Pazienti VALUES(2, 'Luca', 'Bianchi'); INSERT dbo.Pazienti VALUES(3, 'Andrea', 'Montnari'); INSERT dbo.Pazienti VALUES(4, 'Gianluca', 'Hotz'); INSERT dbo.Esami VALUES(1, 1, 'Esame1', '20060101'); INSERT dbo.Esami VALUES(2, 1, 'Esame2', '20060201'); INSERT dbo.Esami VALUES(3, 1, 'Esame3', '20060301'); INSERT dbo.Esami VALUES(4, 2, 'Esame4', '20060101'); INSERT dbo.Esami VALUES(5, 2, 'Esame5', '20060201'); INSERT dbo.Esami VALUES(6, 3, 'Esame6', '20060101'); INSERT dbo.Esami VALUES(7, 3, 'Esame7', '20060201'); INSERT dbo.Esami VALUES(8, 3, 'Esame8', '20060301'); INSERT dbo.Esami VALUES(9, 3, 'Esame9', '20060401'); INSERT dbo.Esami VALUES(10, 4, 'Esame10', '20060101'); GO SELECT P.Nome , P.Cognome , Q2.Esame , Q2.Data FROM dbo.Pazienti AS P INNER JOIN ( SELECT E.* FROM dbo.Esami AS E INNER JOIN ( SELECT PazienteID, Max(Data) AS UltimoEsame FROM dbo.Esami GROUP BY PazienteID ) AS Q ON E.PazienteID = Q.PazienteID AND E.Data = Q.UltimoEsame ) AS Q2 ON P.PazienteID = Q2.PazienteID ORDER BY P.PazienteID; GO /* Output: Nome Cognome Esame Data ---------- ---------- -------------------- ----------------------- Lorenzo Benaglia Esame3 2006-03-01 00:00:00.000 Luca Bianchi Esame5 2006-02-01 00:00:00.000 Andrea Montnari Esame9 2006-04-01 00:00:00.000 Gianluca Hotz Esame10 2006-01-01 00:00:00.000 (4 row(s) affected) */ DROP TABLE dbo.Esami, dbo.Pazienti;

Prova a studiarla un attimino, non è complessa.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

Ciao!
basta scremare la seconda tabella per ottenere soltanto la max data, ovvero la più recente:

/*ammettiamo di avere le due tabelle "pazienti" ed "esami" pazienti id int primary key nome varchar(50) esami id int primary key id_paziente int esame char(3) dataesame datetime */ select * from pazienti p inner join ( select id_paziente,esame,max(dataesame) as data_ultimo_esame from esami grouip by id_paziente,esame ) e on p.id = e.id_paziente

Ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>Ciao!
>basta scremare la seconda tabella per ottenere soltanto la max
>data, ovvero la più recente:

>select id_paziente,esame,max(dataesame) as data_ultimo_esame
> from esami
> grouip by id_paziente,esame
>) e

Attenzione, Roberto voleva recuperare l'esito dell'esame più recente.
Questa query restituisce l'esame più recente... a parità di esame.
Se il paziente esegue 5 tipi di esami diversi per un totale di 50 esami, la query restiuirà 5 righe, non una come richiesto da Roberto.
Occorre raggruppare solo per id_paziente e poi fare una seconda query per beccare solo l'ultimo esame indipendentemente dal suo nome.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

roberto77mds Profilo | Newbie

non sono un espertone di sql ma ci sto arrivando con il vostro aiuto. In merito all'esempio, la query unisce la tabella dei pazienti con la tabella con tutti gli esami di tipo XXY (non di altri tipi per cui ci sono altre tabelle) a me quindi interessa:

a) visualizzare i dati dei pazienti che si sono sottoposti almeno una volta all'esame XXY (e questo si oottiene facendo incrociare gli identificativi paziente)

b) se qualcuno si è sottoposto più di una volta a quell'esame mi deve comparire per quel paziente solo l'ultimo dato

infatti le condizioni sono 2:

ON E.PazienteID = Q.PazienteID
AND E.Data = Q.UltimoEsame

l'unica cosa che non capisco è l'utilizzo di AS E, AS Q, AS Q2

sono tabelle/query provvisorie da utilizzare come "variabili"?

saluti

roberto77mds

lbenaglia Profilo | Guru

>l'unica cosa che non capisco è l'utilizzo di AS E, AS Q, AS Q2
>
>sono tabelle/query provvisorie da utilizzare come "variabili"?

Sono alias di tabella.
Le query racchiuse tra parentesi tonde "()" vengono chiamate tabelle derivate e un alias di tabella permette di identificarle.
Se preferisci puoi salvarle sottoforma di Query (in Access, mentre in ogni altro dbms prendono il nome di viste) ed utilizzarle nella query finale.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

roberto77mds Profilo | Newbie

Ho risolto; siete stati chiari.

grazie a tutti e due ;-)

saluti

roberto77mds

alx_81 Profilo | Guru

ciao!
accetta la risposta così chiudiamo il thread..
Alx81 =)

http://blogs.dotnethell.it/suxstellino
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5