Problema con una SELECT

martedì 29 maggio 2012 - 15.07
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows 7  |  Visual Studio 2010  |  Visual Studio Express  |  Access (.mdb)

Bazzi Profilo | Junior Member

Buongiorno a tutti,

volevo chiedere un consiglio su una select che devo eseguire:
Ho 2 tabelle :
-Tabella Clienti
-Tabella Abbonamenti

Clienti contiene :
Codice - Nome - Cognome

Abbonamenti contiene :
Codice - Data Inizio - Data Fine - NumIngressi - CodiceCliente

Avrei necessità di ottenere, per ogni cliente nella tabella Clienti, una riga con i dati della tabella Abbonamenti relativi alla riga associata al cliente ed avente il codice Abbonamenti più alto...considerando che nella tabella abbonamenti posso avere più di una riga per ogni singolo cliente.
Potete consigliarmi come fare in una unica istruzione di SELECT ?

Grazie
The Bazz

lbenaglia Profilo | Guru

>Avrei necessità di ottenere, per ogni cliente nella tabella Clienti,
>una riga con i dati della tabella Abbonamenti relativi alla riga
>associata al cliente ed avente il codice Abbonamenti più alto...considerando
>che nella tabella abbonamenti posso avere più di una riga per
>ogni singolo cliente.
>Potete consigliarmi come fare in una unica istruzione di SELECT
>?

Ciao,

Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.Clienti( Codice int NOT NULL PRIMARY KEY, Nome varchar(10) NOT NULL, Cognome varchar(10) NOT NULL ); CREATE TABLE dbo.Abbonamenti( Codice int NOT NULL PRIMARY KEY, DataInizio date NOT NULL, DataFine date NOT NULL, NumIngressi int NOT NULL, CodiceCliente int NOT NULL, CONSTRAINT FK_Abbonamenti_Clienti FOREIGN KEY(CodiceCliente) REFERENCES dbo.Clienti(Codice) ); INSERT dbo.Clienti VALUES (1, 'Lorenzo', 'Benaglia') , (2, 'David', 'De Giacomi') , (3, 'Alessandro', 'Alpi'); INSERT dbo.Abbonamenti VALUES (10, '20120101', '20150101', 100, 1) , (20, '20120202', '20150202', 200, 1) , (30, '20120303', '20150303', 300, 3); WITH CTE_GetKey(CodiceAbbonamento, CodiceCliente) AS ( SELECT MAX(Codice), CodiceCliente FROM dbo.Abbonamenti GROUP BY CodiceCliente ) SELECT C.*, A.* FROM dbo.Abbonamenti AS A JOIN CTE_GetKey AS K ON A.Codice = K.CodiceAbbonamento AND A.CodiceCliente = K.CodiceCliente JOIN dbo.Clienti AS C ON K.CodiceCliente = C.Codice ORDER BY C.Codice; /* Output: Codice Nome Cognome Codice DataInizio DataFine NumIngressi CodiceCliente ----------- ---------- ---------- ----------- ---------- ---------- ----------- ------------- 1 Lorenzo Benaglia 20 2012-02-02 2015-02-02 200 1 3 Alessandro Alpi 30 2012-03-03 2015-03-03 300 3 (2 row(s) affected) */ DROP TABLE dbo.Abbonamenti, dbo.Clienti;

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Bazzi Profilo | Junior Member

Grazie, sei stato molto chiaro.
Però approfitto ancora della tua cortesia...e scusa se possono sembrarti dubbi un po' banali...
Spostando leggermente la problematica precedente, se io volessi avere, per ogni cliente il codice abbonamento che ha la data di inizio maggiore ?
Io, al momento, ho risolto con una query simile a quella che tu hai postato, in pratica eseguendo una query raggruppata per codice cliente con MAX(datainizio) sugli abbonamenti e linkando poi la tabella abbonamenti veri e propri con codice cliente e data inizio...ma è il meccanismo più corretto ?

Grazie ancora.
The Bazz

lbenaglia Profilo | Guru

>se io volessi avere, per ogni cliente il codice abbonamento che ha la data
>di inizio maggiore ?
>Io, al momento, ho risolto con una query simile a quella che
>tu hai postato, in pratica eseguendo una query raggruppata per
>codice cliente con MAX(datainizio) sugli abbonamenti e linkando
>poi la tabella abbonamenti veri e propri con codice cliente e
>data inizio...ma è il meccanismo più corretto ?
Certo

WITH CTE_GetKey(DataInizio, CodiceCliente) AS ( SELECT MAX(DataInizio), CodiceCliente FROM dbo.Abbonamenti GROUP BY CodiceCliente ) SELECT C.*, A.* FROM dbo.Abbonamenti AS A JOIN CTE_GetKey AS K ON A.DataInizio = K.DataInizio AND A.CodiceCliente = K.CodiceCliente JOIN dbo.Clienti AS C ON K.CodiceCliente = C.Codice ORDER BY C.Codice; /* Output: Codice Nome Cognome Codice DataInizio DataFine NumIngressi CodiceCliente ----------- ---------- ---------- ----------- ---------- ---------- ----------- ------------- 1 Lorenzo Benaglia 20 2012-02-02 2015-02-02 200 1 3 Alessandro Alpi 30 2012-03-03 2015-03-03 300 3 (2 row(s) affected) */

>Grazie ancora.
Prego.

Ciao!
--
Lorenzo Benaglia
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