Query di selezione

lunedì 03 settembre 2007 - 14.49

trinity Profilo | Guru

Salve ragazzi,
ho due tabelle in sql server 2005:

tabella alberghi
tabella mov_alberghi

sono relazionate tra loro ed ecco per entrabi le colonne chiavi primarie:

Tabella alberghi:
codalbergo
codcomune

tabella mov_alberghi:
codalbergo
codcomune

allora nella tabella alberghi vi sono scritti i record dell'anagrafica della struttura alberghiera mentre nella tabella mov_alberghi ci sono i movimenti.

io in una griglia devo caricare tutti i record dell'anagrafici ma devo prendere contemporaneamente dalla tabella mov_alberghi la colonna data_elaborazione.

come devo strutturare la stored?

ovviamente con un Join ma non mi viene in mente un modo per farlo.
Mi date una mano?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Salve ragazzi,
Ciao!

posta lo script di creazione delle due tabelle e qualche insert di esempio per poter lavorare coi tuoi dati..

Inoltre, se parli di movimenti, come mai la chiave dell'anagrafica è la stessa sui movimenti? Vuol dire che un albergo può avere solo un movimento???


Alx81 =)

http://blogs.dotnethell.it/suxstellino

lbenaglia Profilo | Guru

>ovviamente con un Join ma non mi viene in mente un modo per farlo.
>Mi date una mano?

SELECT .... FROM tabella alberghi AS A JOIN tabella mov_alberghi AS M ON A.codalbergo = M.codalbergo AND A.codcomune = M.codcomune WHERE...;

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

trinity Profilo | Guru

ho scritto così:

ALTER PROCEDURE [dbo].[GetLastDate] ( @CodAlb Int, @CodComAlb Int ) AS BEGIN SELECT albergo.codalb,albergo.codcomune,MAX(Archivio_mov.data_elaborazione)As data FROM albergo JOIN archivio_mov ON albergo.codalb = archivio_mov.codalbergo AND albergo.codcomune = archivio_mov.codcomune WHERE albergo.codalb=@Codalb AND albergo.codcomune=@CodComAlb END

ma mi esce il seguente messaggio di errore:

Messaggio 8120, livello 16, stato 1, procedura GetLastDate, riga 17
La colonna 'albergo.Codalb' non è valida nell'elenco di selezione perché non è inclusa né in una funzione di aggregazione né nella clausola GROUP BY.

tieni presente che nella tabella archivio_mov dove ci sono tutti i movimenti, ci saranno molti record che avranno codalbergo e codcomune uguale ma data_elaborazione diversa, io devo prendere la data + grande

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>ho scritto così:
>
>ALTER PROCEDURE [dbo].[GetLastDate]
>(
>@CodAlb Int,
>@CodComAlb Int
>)
>AS
>BEGIN
>SELECT albergo.codalb,albergo.codcomune,MAX(Archivio_mov.data_elaborazione)As
>data
>FROM albergo
>JOIN archivio_mov
>ON albergo.codalb = archivio_mov.codalbergo
>AND albergo.codcomune = archivio_mov.codcomune
>WHERE albergo.codalb=@Codalb AND albergo.codcomune=@CodComAlb
>END
>
>ma mi esce il seguente messaggio di errore:
>
>Messaggio 8120, livello 16, stato 1, procedura GetLastDate, riga
>17
>La colonna 'albergo.Codalb' non è valida nell'elenco di selezione
>perché non è inclusa né in una funzione di aggregazione né nella
>clausola GROUP BY.

Come ti dice l'errore non indichi la funzione di aggregazione per il campo Codalb (anche per codcomune, ma il parser si ferma al primo).
Quindi, visto che sono identici per ogni riga grazie alla where, basta che aggiungi la GROUP BY alla fine comprendendo quei due campi:

ALTER PROCEDURE [dbo].[GetLastDate] ( @CodAlb Int, @CodComAlb Int ) AS BEGIN SELECT a.codalb , a.codcomune , data = MAX(m.data_elaborazione) FROM albergo a JOIN archivio_mov m ON a.codalb = m.codalbergo AND a.codcomune = m.codcomune WHERE a.codalb = @Codalb AND a.codcomune=@CodComAlb GROUP BY a.codalb , a.codcomune END
Alx81 =)

http://blogs.dotnethell.it/suxstellino

trinity Profilo | Guru

la stored funziona, ma mi sono dimenticato di dire che ci sono degli alberghi che non hanno movimenti e con il codice che mi hai corretto, nella griglia vengono solamente caricati i record che hanno movimenti, io vorrei caricare tutti i record degli alberghi (anagrafica) e li dove non ci sono i valori della data_elaborazione, farò uscire un campo vuoto o un messaggio.

come posso modificare la stored?

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>la stored funziona, ma mi sono dimenticato di dire che ci sono
>degli alberghi che non hanno movimenti e con il codice che mi
>hai corretto, nella griglia vengono solamente caricati i record
>che hanno movimenti, io vorrei caricare tutti i record degli
>alberghi (anagrafica) e li dove non ci sono i valori della data_elaborazione,
>farò uscire un campo vuoto o un messaggio.
>
>come posso modificare la stored?
Fai una OUTER JOIN:

ALTER PROCEDURE [dbo].[GetLastDate] ( @CodAlb Int, @CodComAlb Int ) AS BEGIN SELECT a.codalb , a.codcomune , CASE WHEN MAX(m.data_elaborazione) IS NULL THEN 'Nessuna data' ELSE MAX(m.data_elaborazione) END AS Data FROM albergo a LEFT JOIN archivio_mov m ON a.codalb = m.codalbergo AND a.codcomune = m.codcomune WHERE a.codalb = @Codalb AND a.codcomune=@CodComAlb GROUP BY a.codalb , a.codcomune END

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

trinity Profilo | Guru

fatto grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
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