8 messaggi dal 17 novembre 2004
Perché quando avvio il recordset
"SELECT id, nome FROM utenti GROUP BY nome ORDER BY nome ASC"
mi compare il seguente errore:

Tipo di errore:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][Driver ODBC Microsoft Access] Impossibile eseguire una query che non include l'espressione "id" specificata come parte di una funzione di aggregazione.

Mentre se tolgo il campo nome e relativa funzione
"SELECT nome FROM utenti GROUP BY nome"

tutto gira perfettamente, soltanto che non posso utilizzare il campo 'id'.
Vi è un metodo, uno script, che mi permetta di fare ciò???

Grazie anticipatamente
134 messaggi dal 20 marzo 2001
aggregazione significa appunto somma di più dati.
devi fare il group by con count(id)
quindi conta quanti id ci sono per ogni nome

in pratica nel tuo caso
"SELECT nome,count(id) FROM utenti GROUP BY nome ORDER BY nome ASC"
593 messaggi dal 09 ottobre 2002
www.dotnetside.org
Facendo in parte seguito a quello che forse intendeva dire fusionmen, devo dedurre (e mi scuso per l'eventuiale supponenza) che l'impiego del criterio di raggruppamento (GROUP BY) non ti è moto chiaro.

Esso dovrebbe avere lo scopo di facilitare l'impiego di funzioni di aggregazione (SUM, COUNT, MAX, MIN, AVG, STD). Se non utilizzato in combinazione alle funzioni di aggregazione di cui sopra, si limita a restituire come resultset ina lista di voci distinte univocamente (vale a dire una voce per ogni diversa voce contenuta nel recordset.

Questo risultato sarebbe altresì raggiunto utilizzando SELECT DISTINCT!

Inoltre, effettuare un raggruppamento per ID (se per ID si intente l'identificativo univoco dei record), potresti spiegarmi che senso potrebbe avere dato che non ci saranno mai ID uguali nella medesima tabella e, pertanto, una simile query inevitabilmente listerebbe l'intero resultset?

Mi spiego meglio: in una ipotesi standard, la tua tabella, su un totale di 100 records potrebbe contenere 10 distinti valori per il campo name (es.: 15 Giuseppe, 10 Filippo, 13 Adrea, 20 Giorgio, 5 Saverio, 7 Michele, 1 Federico, 2 Luca, 8 Alberto, 19 FRancesco) ma inevitabilmente conterra 100 occorrenze distinti (perchè univoci) di ID.

Alla luce di questo esempio, capisci perchè la tua query non può essere eseguita? Non c'è "omogeneità" fra i dati del raggruppamento.

Quello che ti suggeriva fusionman è un utilizzo possibile del criterio di raggruppamento combinato con una funzione di aggregazione che ti permetterebbe di conoscere quante occorrenze (o ID come diceva fusionman) ci sono nella tabella per ogni distinto nome.

Meglio comunque modificare la query suggerita da fusionman nel modo seguente:
"SELECT nome,count(*) FROM utenti GROUP BY nome ORDER BY nome ASC;"


Ciao
Modificato da vitosulla il 14 aprile 2005 16.45 -

Pochi post. Anzi, quasi quasi spengo
http://www.dotnetside.org/
8 messaggi dal 17 novembre 2004
Cioa vitosulla, hai compreso perfettamente il mio problema, appunto
potrebbero esserci 10 filippo, 5 saverio, etc, ma ognuno comunque sia ha un suo indentificativo (id).
Quindi non esiste alcun metodo per poter visualizzare i 'nomi' raggruppati con associato il proprio 'id' ???

Grazie ancora per la pazienza...



"vitosulla" <vitosulla> ha scritto nel messaggio news:234183@...
Facendo in parte seguito a quello che forse intendeva dire fusionmen, devo dedurre (e mi scuso per l'eventuiale supponenza) che l'impiego del
criterio
di raggruppamento (GROUP BY) non ti è moto chiaro.
>
Esso dovrebbe avere lo scopo di facilitare l'impiego di funzioni di
aggregazione (SUM, COUNT, MAX, MIN, AVG, STD). Se non utilizzato in
combinazione alle funzioni di aggregazione di cui sopra, si limita a restituire come resultset ina lista di voci distinte univocamente (vale a dire una voce per ogni diversa voce contenuta nel recordset.
>
Questo risultato sarebbe altresì raggiunto utilizzando SELECT DISTINCT! >
Inoltre, effettuare un raggruppamento per ID (se per ID si intente
l'identificativo univoco dei record), potresti spiegarmi che senso
potrebbe
avere dato che non ci saranno mai ID uguali nella medesima tabella e, pertanto, una simile query inevitabilmente listerebbe l'intero resultset? >
Mi spiego meglio: in una ipotesi standard, la tua tabella, su un totale di 100 records potrebbe contenere 10 distinti valori per il campo name (es.: 15 Giuseppe, 10 Filippo, 13 Adrea, 20 Giorgio, 5 Saverio, 7 Michele, 1 Federico, 2 Luca, 8 Alberto, 19 FRancesco) ma inevitabilmente conterra 100 occorrenze distinti (perchè univoci) di ID.
>
Alla luce di questo esempio, capisci perchè la tua query non può essere eseguita? Non c'è "omogeneità" fra i dati del raggruppamento.
>
Quello che ti suggeriva fusionman è un utilizzo possibile del criterio di raggruppamento combinato con una funzione di aggregazione che ti
permetterebbe di conoscere quante occorrenze (o ID come diceva fusionman) ci sono nella tabella per ogni distinto nome.
>
Meglio comunque modificare la query suggerita da fusionman nel modo
seguente:
"SELECT nome,count(*) FROM utenti GROUP BY nome ORDER BY nome ASC;"
>
Ciao ;)
Modificato da vitosulla il 14 aprile 2005 16.45 -
--
novellino
>
>
Hosted by ITHost.ch - your host company
>
8 messaggi dal 17 novembre 2004
Ciao vitosulla, hai compreso perfettamente il mio problema, appunto
potrebbero esserci 10 filippo, 5 saverio, etc, ma ognuno comunque sia ha un suo indentificativo (id).
Quindi non esiste alcun metodo per poter visualizzare i 'nomi' raggruppati con associato il proprio 'id' ???

Grazie ancora per la pazienza...
593 messaggi dal 09 ottobre 2002
www.dotnetside.org
Vedo che ancora non hai compreso. Probabilmente mi sarò espresso male io!

Nel momento in cui esegui il raggruppamento, non potrai mai ottenete l'elenco dei singoli ID afferenti una singola voce di raggruppamento nella stessa query.

Mi pare di capire che quello che vuoi ottenere è un report che contenga il totale dei records presenti per singola occorrenza e, per ciascuna, l'elenco dei relativi ID.

Ma questo non lo ottieni con la query di raggruppamento e/o peggio ancora con una funzione di aggregazione.

Puoi procedere così:
Esegui una query per estrare le distinte occorrenze di nome dalla tabella e, ciclato il recordset esegui una subquery per estrarre gli ID formattando il tutto in tabella.

Eccoti un esempio di come potrebbe essere il tuo report:
<% Dim objCon, objRS, objRS2, strSQL, strSQL2
SET objCon = Server.CreateObject("ADODB.Connection")
objCon.Open = Imposti la connessione al tuo DB
SET objRS = Server.CreateObject("ADODB.Recordset")
 
' Eseguiamo l'estrazione dei distinti nomi col totale delle
' occorrenze di ognuno assegnato ad un campo virtuale Totale
strSQL = "SELECT nome, count(*) AS Totale FROM utenti GROUP BY nome ORDER BY nome ASC;"
objRS.Open strSQL, objCon
%>
<table width="75%">
<tr><th>Report Utenti</th></tr>
<%
' Creazione dell'oggetto subrecordset
SET objRS2 = Server.CreateObject("ADODB.Recordset")
WHILE NOT objRS.EOF
%>
<tr><td align="center">
<table width="75%">
<tr><th colspan="2">Lista ID degli utenti <%=objRS("nome")%></th></tr>
<%
' Eseguiamo una subquery per estrarre, a ciclo, gli ID
' riferiti a ciascun record della query madre
strSQL2 = "SELECT ID FROM utenti WHERE nome = '" & objRS("nome") & "' ORDER BY ID;"
objRS2.Open strSQL2, objCon
%>
WHILE NOT objRS2.EOF
' Listiamo l'elenco degli ID
%>
<tr><td><%=objRS2("ID")%></td><td>&nbsp;</td></tr>
%>
objRS2.MoveNext
WEND
objRS2.Close
%>
<tr><td align="right"><b>Totale:&nbsp;</b></td>
<td><b><%=objRS("Totale")%></td></tr>
</table>
</td></tr>
objRS.MoveNext
WEND
%>
</table>
<%
' Chiudiamo e liberiamo gli oggetti
SET objRS2 = Nothing
objRS.Close
SET objRS = Nothing
objCon.Close
SET objCon = Nothing
%>

Ricorda: è semplicemente un esempio (eventuali errori ortografici compresi). Adattalo a quelle che sono le tue reali esigenze.

Ciao

Pochi post. Anzi, quasi quasi spengo
http://www.dotnetside.org/
134 messaggi dal 20 marzo 2001
hehe vitosulla beato te che hai tutto questo tempo per chiarire così precisamente le cose (corrette)
Questo però è uno degli argomenti relativamente semplici ma difficili da capire leggendo soltanto una spiegazione

In merito al count(id) o count(*) forse dici che è meglio per una portabilità maggiore? Cioè com count(*) funzionerà anche se id lo rinomini in id_1.
Perchè probabilmente, a livello di prestazioni, è più veloce count(id)  ma non ci metterei la mano sul fuoco.

In ogni caso la tua sintesi è stata molto dettagliata
593 messaggi dal 09 ottobre 2002
www.dotnetside.org
Ciao fusionman,
più che tempo a disposizione è che amo la chiarezza.
[OT mode=on]
Inoltre sono dell'avviso che, citando un famoso proverbio cinese, "se uno ha fame, non dargli un pesce. Insegnagli a pescare".

Per questo, più che la particolarità (che può assumere infinite sfaccettature), preferisco concentrarmi sull'aspetto generale di una questione.

Rimanendo in tema di citazioni, Catone (grande personaggio e illustre oratore della storia classica romana) era solito esortare i suoi allievi a non preoccuparsi di trovare le parole adatte ma a concentrarsi sul concetto (sostanza) più che sulle parole (dettagli), poichè, a suo dire, "Rem tene, verba sequentur" e cioè quando hai ben chiaro un concetto le parole seguono inevitabilmente.
[OT mode=off]

Tornando alla tua osservazione, in termini di prestazioni tra Count(*) e Count(nomecampo) non c'è in effetti differenza. Il discorso è diverso da SELECT * e SELECT campo1.
Piuttosto, come indicavi giustamente tu, la modifica garantisce una maggiore portabilità poichè è assolutamente svincolata da ipotesi di modifiche al campo ID.

Ciao fusionman, Vito
Modificato da vitosulla il 15 aprile 2005 16.10 -

Pochi post. Anzi, quasi quasi spengo
http://www.dotnetside.org/

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.