Errore nella query utilizzando grid view

mercoledì 20 luglio 2011 - 09.16

netting Profilo | Junior Member

Devo instaurare una relazione tra 2 tabelle, scrivendo il seguente codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ma mi dà questo errore:

SQL Execution Error
Error source .Net SqlClient Data Provider
Error Message: Column 'Login.Utente' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Quindi si può intendere che attraverso quell'istruzione sql voglio mettere in relazione due tabelle associando un user identificativo con i relativi suoi dati (in questo caso ore, e data) Count mi serve per contare il numero di record trovati così da avere il numero di presenze e la clausola WHERE mi dice di estrarre solo l'ultimo record inserito.

Mi sembra di capire che devo inserire una clausola GROUP BY ma non sò dove.

Gluck74 Profilo | Guru

anche se questo è un poroblema SQL, e non asp.net......................

non puoi inserire nella stessa select una funzione di aggregazione come il COUNT, insieme ad un normale campo.
devi usare ad esempio una finestra
SELECT Login.Utente, PresenzeStagisti.Data, PresenzeStagisti.Ore, ROW_NUMBER() over (order by Login.Utente) as [Num. riga] FROM Login INNER JOIN PresenzeStagisti ON Login.Utente=PresenzeStagisti.Users WHERE IDStagisti=( SELECT TOP 1 IDStagisti FROM [PresenzeStagisti] ORDER BY [IDStagisti] DESC )

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

alx_81 Profilo | Guru

Ciao
>Quindi si può intendere che attraverso quell'istruzione sql voglio
>mettere in relazione due tabelle associando un user identificativo
>con i relativi suoi dati (in questo caso ore, e data) Count mi
>serve per contare il numero di record trovati così da avere
>il numero di presenze e la clausola WHERE mi dice di estrarre
>solo l'ultimo record inserito.
Siccome il risultato finale avrà probabilmente più date per l'utente che vai a filtrare (come mai sempre il top 1? Ti serve sapere sempre la situazione dell'ultimo stagista?), potrebbe bastare fare la group by sui campi non aggregati:
SELECT L.Utente , P.Data , P.Ore , Conteggio = COUNT(*) FROM Login L INNER JOIN PresenzeStagisti P ON L.Utente = P.Users WHERE [...] GROUP BY L.Utente , P.Data , P.Ore

Prova a vedere se il risultato è quello desiderato..
ciao!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

netting Profilo | Junior Member

in pratica ho modificato in questo modo togliendo il count che poi faccio con un'altra query in seguito, ora il problema è la clausola ON,
in pratica io voglio che devono essere estratti tutti i dati riguardo lo stage di un utente.
Questo utente dopo essersi loggato entra nell'area riservata e inserisce ora e data, in questo modo salvo in un'altra tabella che si chiama PresenzeStagisti, il nome utente con cui ho effettuato il login , DAta e ore.
Quindi quando effettuo la query io voglio visualizzare il nome utente di chi si è loggato(presente nella tabella Login)e le ore e le date delle presenze(presenti nella tabella PresenzeStagisti), quando il nome utente di chi si è loggato è uguale al nome utente che è presente nella tabella PresenzeStagisti. (il campo utente in questa tabella si chiama Users)

alx_81 Profilo | Guru

>in pratica ho modificato in questo modo togliendo il count che
>poi faccio con un'altra query in seguito,
mmmh.. secondo me potevi lasciarlo lì per come ti dicevo. Eviterei una query ulteriore se non necessaria.

>ora il problema è la clausola ON, in pratica io voglio che devono essere estratti tutti i dati
>riguardo lo stage di un utente. Questo utente dopo essersi loggato entra nell'area riservata
>e inserisce ora e data, in questo modo salvo in un'altra tabella
>che si chiama PresenzeStagisti, il nome utente con cui ho effettuato
>il login , DAta e ore. Quindi quando effettuo la query io voglio visualizzare il nome
>utente di chi si è loggato(presente nella tabella Login)e le
>ore e le date delle presenze(presenti nella tabella PresenzeStagisti),
>quando il nome utente di chi si è loggato è uguale al nome utente
>che è presente nella tabella PresenzeStagisti. (il campo utente
>in questa tabella si chiama Users)
Una cosa che non si capisce è il contenuto dei tuoi campi. Non si riesce a capire se ci sono chiavi sulle tabelle, se quei campi Utente e Users sono nomi, ecc...
puoi postare la CREATE delle due tabelle così riusciamo a darti consigli sul modello e a farti la query più corretta?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

netting Profilo | Junior Member

Allora io ho due tabelle, una chiamata Login con i seguenti campi (non ci sono primary key):
IDUtente int
Utente nchar(30)
Passowrd nchar(30)

l'altra tabella è chiamata PresenzeStagisti con i seguenti campi(non ci sono primary key):
IDStagisti int
Users nchar(30)
Ore int
Data nchar(30)

I dati riguardanti la tabella login servono ovviamente per essere autenticati e quindi poter accedere ad una pagina (area riservata) dove inserire data e ore dello stage, mentre nel campo users della tabella presenzestagisti ci va a finire il contenuto del campo utente della tabella login.

Quindi io quando accedo ad una pagina che si chiama infostage, dopo essermi loggato, devo visualizzare tutti i dati (quindi ora e data della tabella presenze stagisti con il nome di chi si è loggato presente nella tabella login nel campo utente) dell'utente loggato.

Praticamente sembra che la clausola ON non venga eseguita.

Gluck74 Profilo | Guru

@Alex: puoi spostare sul forum SQL?

@netting:
ti scrivo un paio di cose che, secondo me, devi fare assolutamente:
1 - Nella tabella Login, IDUtente deve essere chiave primaria e pure Identity
2 - Nella tabella Presenze, il campo Users non ci deve essere, ma un campo IDUtente numerico
3 - Il campo IDUtente nella tabella Presenze, deve essere chiave esterna verso IDUtente della tabella Login
4 - Ci vuole anche una chiave nella Tabella Presente: Trasforma IDStagisti in chiave e identity

Le query a questo punto le farei così (giustamente 2: una per l'elenco, una per il conteggio)
SELECT L.Utente, P.Data, P.Ore FROM Login L INNER JOIN PresenzeStagisti P ON L.IDUtente=P.IDUtente WHERE P.IDUtente=@IDUtente SELECT L.Utente, P.Num FROM Login L INNER JOIN ( SELECT IDUtente, Count(IDUtente) as Num FROM PresenzeStagisti WHERE IDUtente=@IDUtente GROUP BY IDUtente ) P ON L.IDUtente=P.IDUtente

Dove il parametro "@IDUtente" lo passi alla query in base al valore prelevato dall'autenticazione dell'utente sul sito.

Sicuramente per quanto riguarda le performance delle query, Alex è molto più ferrato di me.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

netting Profilo | Junior Member

sei stato molto esauriente nella spiegazione, ma non funziona, ho seguito tutti i tuoi passaggi ma non funziona, e non ho capito anche perchè lavorare sugli ID in quanto io vorrei comparare se il nome utente è uguale a alla persona che si è loggata, perchè nel caso poi gli ID non coincidono io non ho i risultati sperati, mentre comparando i nomi utenti io ho la certezza che mi estrae i dati esatti.

Non sò proprio come continuare....e cosa provare....
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