Crrezione errore in questa stored..group by

mercoledì 18 aprile 2007 - 15.10

trinity Profilo | Guru

salve ragazzi ho scritto questa stored, senza il group by mi funziona solo che mi replica n volte a seconda dei record che seleziona.
Allora ho pensato di aggiungere un Group By per il codalbergo il quale è chiave primaria della tabella. di seguito vi è riportato il codice:

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

solo che quando la eseguo mi esce il seguente errore:

Messaggio 8120, livello 16, stato 1, procedura GetRecordAlb, riga 15
La colonna 'dbo.Archivio_mov.codalbergo' non è valida nell'elenco di selezione perché non è inclusa né in una funzione di aggregazione né nella clausola GROUP BY.


vi riporto anche la cotruzione delle due tabelle per sicurezza:

tabella archivio_mov

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

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


seconda informazione tenendo presente le due tabelle sopraelencate
si può nella stored precendete aggiungere anche la possibilità di ricavare tutti i record alberghi presenti nella tabella alberghi e far uscire un valore che dice di tutti gli alberghi presenti solo albergo x ed y hanno record nella tabella archivio_mov.
Una cosa del genere:

tabella alberghi

1 albergo poseidon
2 albergo prova
3 albergo federico
4 albergo pippo

archivio_mov

codicealbergo cliente nazionalità stato
1 franco italia arrivato
1 lucia italia arrivato
3 mattia italia arrivato

pertanto come risultato vorrei questo:


1 albergo poseidon record elaborati 2
2 albergo prova record elaborati nessuno
3 albergo federico record elaborati 1
4 albergo pippo record elaborati nessuno
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!
>ho scritto questa stored, senza il group by mi
>funziona solo che mi replica n volte a seconda dei record che
>seleziona.
>Allora ho pensato di aggiungere un Group By per il codalbergo
>il quale è chiave primaria della tabella.
il problema sta nel fatto che la group by va fatta su tutti i campi che non sono utilizzati in altre funzioni di aggregazione. Group by non fa altro che schiacciare il record, tutti i campi, nessuno escluso. Quelli che ci sono nella select devono essere anche nella Group by o essere utilizzati in altre funzioni di aggregazione come MAX, MIN, AVG, SUM... ecc..

trinity Profilo | Guru

è la prima parte del mio post primario e si conclude quando inizio a chiedere informazioni sulla seconda situazione
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

si scusami.. ho modificato il post.. non avevo visto la group by
per quanto riguarda il resto, sto facendo prove e fra poco avrai una risposta..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

trinity Profilo | Guru

grazie mille tantissmo, devo assolutamente capire dove sbaglio altrimenti sto fermo con un lavoro che devo consegnare domani

che iella :-(
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>grazie mille tantissmo, devo assolutamente capire dove sbaglio
>altrimenti sto fermo con un lavoro che devo consegnare domani
allora.. premesso che la group by la puoi fare solo con le specifiche del post che ti ho scritto prima, ecco una modifica alla stored procedure che ti consente di avere il risultato finale del conteggio.

Ho dovuto rimuovere il prog schedina (e probabilmente dovrai togliere altri campi in base ai possibili casi di moltiplicazione dei record nonostante la group by) e ho rifatto la group by, aggiungendo il count di un campo che può essere null se non si verifica la join. In questo modo ottieni il corretto conteggio per ogni albergo..
prova e fammi sapere.. magari dalle un altro nome per provarla..

ALTER PROCEDURE [dbo].[GetRecordAlb] ( @CodAlbergo Int, @DallaData SmallDateTime, @AllaData SmallDateTime ) AS BEGIN SET NOCOUNT ON; SELECT Alb.Codalb, --MOV.prog_schedina, MOV.annogestionale, MOV.data_elaborazione, MOV.stato, MOV.ncomp, MOV.stato_res, MOV.Codstato, MOV.prov, MOV.codcomune, Descrizione=Alb.descrizione, CodiceRegione=Alb.codreg, CodiceProvincia=Alb.codprov, CodiceComune=Alb.codcomune, Conteggio=COUNT(MOV.annogestionale) FROM Archivio_mov MOV RIGHT JOIN Albergo Alb ON Alb.codalb = MOV.Codalbergo WHERE MOV.Codalbergo=@CodAlbergo AND MOV.Data_elaborazione BetWeen @DallaData AND @AllaData GROUP BY Alb.Codalb, --MOV.prog_schedina, MOV.annogestionale, MOV.data_elaborazione, MOV.stato, MOV.ncomp, MOV.stato_res, MOV.Codstato, MOV.prov, MOV.codcomune, Alb.descrizione, Alb.codreg, Alb.codprov, Alb.codcomune END
Alx81 =)

http://blogs.dotnethell.it/suxstellino

trinity Profilo | Guru

la stored funziona e anche il count ma non ottengo un unico record ma bensì tutti i record di un determinato albergo.

vedi l'immagine allegata


973x177 36Kb


fondamentalmente la query per avere il group by che voglio dovrebbe essere questa:

ALTER PROCEDURE [dbo].[GetRecordAlb1] ( @CodAlbergo Int, @DallaData SmallDateTime, @AllaData SmallDateTime ) AS BEGIN SET NOCOUNT ON; SELECT MOV.Codalbergo, --MOV.prog_schedina, --MOV.annogestionale, --MOV.data_elaborazione, --MOV.stato, --MOV.ncomp, --MOV.stato_res, --MOV.Codstato, --MOV.prov, --MOV.codcomune, Descrizione=Alb.descrizione, --CodiceRegione=Alb.codreg, --CodiceProvincia=Alb.codprov, --CodiceComune=Alb.codcomune, Conteggio=COUNT(MOV.annogestionale) FROM Archivio_mov MOV RIGHT JOIN Albergo Alb ON Alb.codalb = MOV.Codalbergo WHERE MOV.Codalbergo=@CodAlbergo AND MOV.Data_elaborazione BetWeen @DallaData AND @AllaData GROUP BY MOV.Codalbergo, --MOV.prog_schedina, --MOV.annogestionale, --MOV.data_elaborazione, -- MOV.stato, --MOV.ncomp, --MOV.stato_res, --MOV.Codstato, --MOV.prov, --MOV.codcomune, Alb.descrizione --Alb.codreg, --Alb.codprov, --Alb.codcomune END


solo che i campi che ho tolto mi servono. per farla breve i campi che non mi servono sono mov.prog_schedina, mov.annogestionale,mov.codcomune

ma visto e sto pensando ora che nella query che mi hai dato tu non posso fare anche quella che mi dia il risultato che ti faccio vedere nella prossima immagine:


288x39 5Kb


allora mi pongo la seguente domanda:
in una sola stored posso fare due query in pratica la prima che mi hai dato tu e mi restituisce i record della prima immagine e una seconda query che parte alla fine della prima e che mi restituisce il risultato della seconda immagine.


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

alx_81 Profilo | Guru

>la stored funziona e anche il count ma non ottengo un unico record
>ma bensì tutti i record di un determinato albergo.
Come ti dicevo.. sei costretto a fare la group by dei campi che sai che ti permetteranno di ricavare il record univoco per ogni conteggio..
Quindi devi capire cosa rimuovere dalla select e dalla group by..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

trinity Profilo | Guru

si questo l'ho capito ma io la prima query mi serve perchè ho bisogno del risultato che ti fa vedere la mia immagine ma vorrei anche che mi uscisse un risultato della seconda immagine. Ecco perchè ho pensato che forse sia meglio in una stored eseguire due query differenti sempre se si può fare ovviamente
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>si questo l'ho capito ma io la prima query mi serve perchè ho
>bisogno del risultato che ti fa vedere la mia immagine ma vorrei
>anche che mi uscisse un risultato della seconda immagine. Ecco
>perchè ho pensato che forse sia meglio in una stored eseguire
>due query differenti sempre se si può fare ovviamente
certo.. puoi fare una stored procedure con i due resultset.. e poi gestire da codice le due query..
credo che il dataadapter capisca quanti resultset ci sono.. quindi puoi usarlo per riempire con la Fill il tuo dataset ritrovandoti tue tabelle nella collection tables dopo l'esecuzione del comando..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

trinity Profilo | Guru

non uso il dataadapter ma il datareader per i campi non vanno in un dataset

come come faccio a mettere due query in una stored unica e a distinguere i poi i campi che andrò ad attribuire con il data reader?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>non uso il dataadapter ma il datareader per i campi non vanno
>in un dataset
ok
>
>come come faccio a mettere due query in una stored unica e a
>distinguere i poi i campi che andrò ad attribuire con il data
>reader?
separa tutti i tuoi statement SQL col ';' e poi esegui la query..
la prima execute ti torna il primo resultset, poi, per accedere agli altri devi utilizzare il metodo dataReader.NextResult()

leggi qui
http://msdn2.microsoft.com/en-us/library/microsoft.visualstudio.data.datareader.nextresult(VS.80).aspx

Ciao!


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

Alx81 =)

http://blogs.dotnethell.it/suxstellino

trinity Profilo | Guru

ecco le due stored che vorrei unificare in una sola:

prima

ALTER PROCEDURE [dbo].[GetRecordAlb] ( @CodAlbergo Int, @DallaData SmallDateTime, @AllaData SmallDateTime ) AS BEGIN SET NOCOUNT ON; SELECT MOV.Codalbergo, MOV.prog_schedina, MOV.annogestionale, MOV.data_elaborazione, MOV.stato, MOV.ncomp, MOV.stato_res, MOV.Codstato, MOV.prov, CodiceComune=Alb.codcomune, Descrizione=Alb.descrizione, CodiceRegione=Alb.codreg, CodiceProvincia=Alb.codprov FROM dbo.Archivio_mov MOV JOIN dbo.Albergo Alb ON Alb.codalb= MOV.Codalbergo WHERE MOV.Codalbergo=@CodAlbergo AND MOV.Data_elaborazione BetWeen @DallaData AND @AllaData END


seconda
ALTER PROCEDURE [dbo].[GetRecordAlb3] ( @CodAlbergo Int, @DallaData SmallDateTime, @AllaData SmallDateTime ) AS BEGIN SELECT COUNT(Mov.codalbergo) As nrec,ALB.codalb,ALB.descrizione FROM dbo.archivio_mov MOV JOIN dbo.Albergo ALB ON MOV.codalbergo= ALB.codalb WHERE Codalbergo=@CodAlbergo AND data_elaborazione between @dalladata and @alladata Group By MOV.codalbergo,ALB.codalb,ALB.descrizione END

io ho pensato di fare così:

ALTER PROCEDURE [dbo].[GetRecordAlb] ( @CodAlbergo Int, @DallaData SmallDateTime, @AllaData SmallDateTime ) AS BEGIN SET NOCOUNT ON; SELECT MOV.Codalbergo, MOV.prog_schedina, MOV.annogestionale, MOV.data_elaborazione, MOV.stato, MOV.ncomp, MOV.stato_res, MOV.Codstato, MOV.prov, CodiceComune=Alb.codcomune, Descrizione=Alb.descrizione, CodiceRegione=Alb.codreg, CodiceProvincia=Alb.codprov FROM dbo.Archivio_mov MOV JOIN dbo.Albergo Alb ON Alb.codalb= MOV.Codalbergo WHERE MOV.Codalbergo=@CodAlbergo AND MOV.Data_elaborazione BetWeen @DallaData AND @AllaData; SELECT COUNT(Mov.codalbergo) As nrec,ALB.codalb,ALB.descrizione FROM dbo.archivio_mov MOV JOIN dbo.Albergo ALB ON MOV.codalbergo= ALB.codalb WHERE Codalbergo=@CodAlbergo AND data_elaborazione between @dalladata and @alladata Group By MOV.codalbergo,ALB.codalb,ALB.descrizione END

giusto? e poi il datareader.NextResult

lo devo fare dopo la while...wend?

perchè ecco il codice che utilizzo per prelevare i record dalla prima stored

Public Function CaricaRecAllAlb(ByVal ObjC59 As PropertyC59) As C59Collection Dim C59Coll As New C59Collection SqlCmd.CommandText = "GetRecordAlb" SqlCmd.Parameters.Add("@CodAlbergo", SqlDbType.Int).Value = ObjC59.CodAlbergo SqlCmd.Parameters.Add("@DallaData", SqlDbType.DateTime).Value = ObjC59.DallaData SqlCmd.Parameters.Add("@AllaData", SqlDbType.DateTime).Value = ObjC59.AllaData Try SqlCmd.Connection = Db SqlCmd.CommandType = CommandType.StoredProcedure SqlDr = SqlCmd.ExecuteReader While SqlDr.Read ObjC59 = New PropertyC59 ObjC59.CodAlbergo = SqlDr.GetSqlInt32(0).Value ObjC59.NumeroSchedina = SqlDr.GetSqlInt32(1).Value ObjC59.Annogestionale = SqlDr.GetSqlInt32(2).Value ObjC59.DataElaborazione = SqlDr.GetSqlDateTime(3).Value ObjC59.Tipostato = SqlDr.GetSqlString(4).Value ObjC59.NumeroComponenti = SqlDr.GetSqlInt32(5).Value ObjC59.StatoResidenza = SqlDr.GetSqlString(6).Value ObjC59.CodStato_Res = SqlDr.GetSqlString(7).Value ObjC59.ComuneResidenza = SqlDr.GetSqlString(8).Value ObjC59.CodComune = SqlDr.GetSqlInt32(9).Value ObjC59.NomeAlbergo = SqlDr.GetSqlString(10).Value ObjC59.CodiceRegione = SqlDr.GetSqlInt32(11).Value ObjC59.CodiceProvincia = SqlDr.GetSqlInt32(12).Value C59Coll.Add(ObjC59) End While Catch ex As Exception Throw ex Finally SqlDr.Close() SqlCmd.Parameters.Clear() SqlCmd.Dispose() End Try Return C59Coll End Function



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

alx_81 Profilo | Guru

>giusto?
la stored unificata è ok

>e poi il datareader.NextResult
>lo devo fare dopo la while...wend?
sì, perchè devi finire la lettura del primo "recordset"..
finito di leggere uno, nextresult e leggi l'altro..
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5