Newsgroup: it.comp.appl.access
Titolo: query di raggruppamento ed espressioni su stringhe

Data una tabella:
tPersona
   nome: string
   anni: byte
voglio ottenere un recordset composto da due colonne:
una contenente una stringa composta dai nomi separati
con una virgola di tutti i coetanei e l'altra con il relativo
valore degli anni.
da:
   anna    3
   mario   3
   luca     5
   lisa      5
ottenere:
   anna, mario    3
   luca, lisa        5
Mi aspettavo di poter fare una query di raggruppamento,
raggruppando il campo 'anni' e concatenando il campo 'nomi',
(mettendo "Espessione" come raggruppamento per 'nome'
e richiamando una funzione pubblica per la concatenazione)
ma pare che questo non sia possibile.
Sbaglio? Qualche suggerimento?
Grazie,
Leo

 ma pare che questo non sia possibile.
Una funzione e' l'unica possibilità, temo, ma solo a pensarci mi si
accapona la pelle...  comunque si puo' fare. La funzione
Function Accoda(NuovoValore As String, ChiaveCorr As integer) As
String
Static ValoriAccodati As String
Static Chiave As integer
If ChiaveCorr <> Chiave then ValoriAccodati = ""
Chiave = ChiaveCorr
If ValoriAccodati > "" Then ValoriAccodati = ValoriAccodati & ", " &
NuovoValore Else ValoriAccodati = NuovoValore
Accoda = ValoriAccodati
End Function
verifica se l'eta' e' sempre la stessa, accoda il nome all'elenco gia'
iniziato, altrimenti inizia un nuovo elenco.
e la query:
SELECT Eta, Last(accoda([nome],[eta])) AS Nomi
FROM Tabella1
GROUP BY Eta;
e' importante che i record arrivino alla query gia' ordinati per età.
cia'
Max

 e' importante che i record arrivino alla query gia' ordinati per età.
questo era un errore che commettevo. grazie.
ad ogni modo il problema non si risolve perche, nonostante
ordini i dati in modo corretto con un apposita query prima di
passarli alla query di raggruppamento, la funzione riceve in input
i dati in un ordine scorretto (non ho ancora capito quale!).
ciao e grazie
Leo

 ad ogni modo il problema non si risolve
ora ho provato cosi':
query1 --> ordino i dati
query2 --> calcolo l'accodamento
query3 --> raggruppo i dati scegliendo l'ultimo valore della colonna
con l'accodamento
niente da fare!
il che e' strano perche' se nella query3 tolgo il raggruppamento
i record si presentano nel modo in cui ci si aspetta (cioe' ordinati
e con la colonna di accodamento che "nasce e cresce" correttamente)

 i dati in un ordine scorretto (non ho ancora capito quale!).
Allora ti propongo un altro sistema, se possibile ancora piu'
grezzo :D
Function Accoda(Nome As String, Eta As Integer) As String
Static Elenco(1 To 50) As String
Elenco(Eta) = IIf(Elenco(Eta) > "", Elenco(Eta) & ", ", "") & Nome
Accoda = Elenco(Eta)
End Function
SELECT Tabella1.Eta, Last(Accoda([Nome],[Eta])) AS ElencoNomi
FROM Tabella1
GROUP BY Tabella1.Eta;
Questo e' *VERAMENTE* rozzo, eh! Fa il paio col tizio che usa una
vanga per mescolare il caffé. E come se non bastasse, devi inventarti
il modo di svuotare l'array prima di ogni esecuzione della query...
cia'
Max

 con l'accodamento
Query2 non serve a nulla.
Una query sola che si calcola gli accodamenti mentre raggruppa e' piu'
che sufficiente. Ho provato la query che ti ho scritto ieri su un mio
DB e funziona bene.
(Certo, farlo su un mio DB da 75.000 record e' stata una mossa un
tantino azzardata :D)
cia'
Max

 Query2 non serve a nulla.
Certo. La mia era solo la "prova del 9" per verificare anche
visivamente
la correttezza dell'ordinamento e dei risultati tornati dalla
funzione.
Questo e' un estratto di query2 (come noterai quello da me citato
con 'nomi' e 'eta' era solo un esempio per semplificare la questione,
in realta' al posto dei nomi ho codici prodotto e al posto dell'eta'
ho
le misure di lunghezza,  profondita' e spessore, in piu' c'e' un campo
quantita' di cui nella query di riepilogo calcolo la somma):
qta      sp     lung    prod     cod
161	18	473	678	FO16
83	18	555	340	FI21
79	18	555	340	FI21 - FI22
79	18	555	340	FI21 - FI22 - FI23
83	18	555	340	FI21 - FI22 - FI23 - FI24
275	18	570	160	RE03
404	18	570	340	FI25
511	18	570	340	FI25 - FI26
422	18	570	340	FI25 - FI26 - FI27
493	18	570	340	FI25 - FI26 - FI27 - FI28
162	18	572	306	RI07
Da questo risultato mi aspetterei che
raggruppando i record per sp, lung, prof
sommando qta
prendendo l'ultimo (o il max) di cod
il risultato fosse:
qta      sp     lung    prod     cod
161	18	473	678	FO16
324	18	555	340	FI21 - FI22 - FI23 - FI24
275	18	570	160	RE03
1830	18	570	340	FI25 - FI26 - FI27 - FI28
162	18	572	306	RI07
e invece no! :)
(e non ho ancora capito bene cosa succede)
grazie ancora
Leo

 e invece no! :)
l'unico hack che ad ora mi fornisce il risultato corretto
e' utilizzare query2 per creare una tabella temporanea
e su questa fare il raggruppamento come descritto nel
mio precedente post.
Leo