Newsgroup: it.comp.software.database
Titolo: PostgreSql  e Group by

Salve a tutti,
sto.........o stavo.....??? migrando un applicazione da mySql a PostgreSql, 
ma ho scoperto che quest'ultimo utilizza un group by a dir poco assurdo, 
ossia, per quanto ho capito, č indispensabile inserire nella clausola group 
by TUTTE le colonne inserite nella select. Cosě č ovvio che non si ottiene 
un accidente di niente!
Se, per esempio io voglio una select codice,cognome,nome group by codice, 
per ottenere un elenco univoco dei nominativi, sono costretto a mettere nel 
group by codice,cognome,nome, ottenendo una select assurda e non univoca.
Spero di essermi sbagliato e che le cose non stiano cosě, o quantomeno che 
ci sia un escamotage, altrimenti torno di gran carriera a MySql.
Qualcuno puň chiarirmi le idee?
Grazie.
                                Francesco 

 Qualcuno può chiarirmi le idee?
Nei database seri[1] il GROUP BY viene utilizzato quando nella query ho
delle funzioni di raggruppamento dei valori. Un esempio pratico e` dato
dalla seguente tabella:
SELECT * FROM attori
|nome    |cognome  |sesso  |
------------------------
|Alberto |Sordi    |Maschio|
|Paolo   |Villaggio|Maschio|
|Vittorio|Gassman  |Maschio|
|Edwige  |Fenech   |Femmina|
|Gloria  |Guida    |Femmina|
Una query che utilizza il GROUP BY potrebbe essere la seguente:
SELECT sesso, Count(nome) AS num_sesso
  FROM attori
 GROUP BY sesso
Il comportamento che tu descrivi (ovvero l'estrazione dei dati univoci)
e` dato da una query del genere:
SELECT DISTINCT sesso FROM attori
Per maggiori informazioni sul funzionamento del GROUP BY, guarda qua:
http://en.wikipedia.org/wiki/Group_by_(SQL)
Enrico
[1] sono di parte, non posso soffrire MySQL, soprattutto considerando
l'abuso e alle nefaste conseguenze a cui porta (ovviamente penso che
PostgreSQL sia un database serio)

 PostgreSQL sia un database serio)
Sono daccordo in parte con te, altrimenti non starei tentando la migrazione, 
ma per alcuni aspetti ti assicuro
che mySql č decisamente piů versatile degli altri, vedi gli autoincrement, i 
join con use() e, appunto il GROUP BY.
Spero di riuscire a risolvere il problema altrimenti lo dovrň abbandonare 
mio malgrado, io faccio un uso intensissimo
di group by...............
Grazie per l'aiuto.
                                                Francesco

                                 Francesco
Spero di essere stato chiaro.
Lucazeo

[...]
Mi risulta che sia il normale comportamento di un db relazionale:
Se vuoi avere i risultati univoci dei nominativi, che senso ha
inserire anche altri
campi, che non sono univoci in questo contesto?
Per esempio: se tu volessi raggruppare per cognome, che senso ha
estrarre
anche il nome? Il database non potrebbe farlo correttamente, a meno di
non
estrarre un nome a caso per ogni cognome...
Quando utilizzi una group by, tanto in postgresql, che in sql server,
devi
selezionare solo i campi che ti interessano e funzioni di
aggregazione.
Penso che anche mysql abbia  diverse modalità di funzionamento.
Spero di essere stato chiaro.
Lucazeo
Dipende dai casi........
Per esempio a me serve il codice di ogni nominativo con cognome e nome e il 
primo numero di pratica inserito.
Se io provo ad eseguire una query:
select codice,cognome,nome,numero group by codice, ovviamente mi dice di 
inserire anche gli altri campi nel group by ma a me serve
solo il raggruppamento per codice.......
In effetty mySql funziona decisamente in modo diverso........
Grazie per l'aiuto, sei stato chiarissimo.
                                            Francesco 

 Link non attivo.........
http://en.wikipedia.org/wiki/GROUP_BY

                                             Francesco
Con mysql dovrebbe trovarti il primo numero solo se gli indici sono
fatti in un
certo modo. Supponiamo che il primo numero di pratica sia il più
basso,
prova con una query di questo tipo:
SELECT Codice, Cognome, Nome, MIN(numero)
Group BY Codice, Cognome, Nome
Spero di essere stato utile. Posso dirti che il passaggio da mysql a
postgresql non potrà che darti soddisfazioni.
Lucazeo

 ha scritto nel messaggio 
news:57d7aaef-afa5-424a...@56g2000hsm.googlegroups.com...

Ok, questo funge......... :-) 

 primo numero di pratica inserito.
first(numero)
-- 
Fa freddo nello scriptorium, il pollice mi duole. Lascio questa 
scrittura, non so per chi, non so più intorno a che cosa...
U. Eco

 Select cognome,nome,sesso group by sesso...........:-(((
Per forza non è possibile. Ragiona un attimo: tipicamente l'attributo
sesso divide una popolazione in due gruppi di n ed m membri. In base a
quale ragionamento secondo te il DB dovrebbe "scegliere" un cognome e
un nome tra gli n ed m disponibili e darti un risultato? Se mysql lo
fa, vuol dire che tira a caso, ed è solo l'ennesima dimostrazione che
è un sistema bacato nel midollo.
Se vuoi che funzioni devi mettere una funzione di tipo aggregate anche
su quei campi, in modo che il DBMS possa tirare fuori un valore
univoco.
bye!

 Select cognome,nome,sesso group by sesso...........:-(((
Per forza non č possibile. Ragiona un attimo: tipicamente l'attributo
sesso divide una popolazione in due gruppi di n ed m membri. In base a
quale ragionamento secondo te il DB dovrebbe "scegliere" un cognome e
un nome tra gli n ed m disponibili e darti un risultato? Se mysql lo
fa, vuol dire che tira a caso, ed č solo l'ennesima dimostrazione che
č un sistema bacato nel midollo.
Se vuoi che funzioni devi mettere una funzione di tipo aggregate anche
su quei campi, in modo che il DBMS possa tirare fuori un valore
univoco.
bye!
Si, ma faccio un esempio piů realistico:
select cod_fisc,count(*) from ricette group by cod_pazi
E' una semplice query che puň servire a controllare alcuni dati.
Se la eseguo con MySql nessun problema, con PostgreSql mi costringe ad 
inserire il cod_fisc
nel Group by e si perde il senso della query.........
Questo č un esempio creato al volo ma ce ne sono altri molto piů 
esplicativi.
Il problema di postgreSql č che non posso ottenere un elenco di campi lě 
dove c'č un group by se non li inserisco
nella clausola.............non so se č un baco di MySql ma lo uso da 8 anni 
senza aer mai avuto problemi...
Ciao.
                                    Francesco 

 senza aer mai avuto problemi...
Senza offesa, mi sembra che la lunga frequentazione con mysql un
problema te l'abbia comportato: non hai capito come si usa la group
by... ;^)
bye!

 risultato ti aspetti? [...] Che scelga a caso?
Hem... praticamente e` cosi' :-(
Leggendo nei doc di MySql (il che mi succede sempre piu` spesso),
ho trovato che:
http://dev.mysql.com/doc/refman/6.0/en/group-by-hidden-fields.html
"The server is free to return any value from the group, so the
results are indeterminate unless all values are the same."
Si tratta di un'ottimizzazione che va a discapito della correttezza;
nel caso i valori non siano uguali, si avra` una data-roulette. 

 senza aer mai avuto problemi...
Non e` un baco, e` una delle tante "feature" di MySQL che hanno il
"semplice" inconveniente di rendere il tuo lavoro incompatibile con
tutto cio` che non sia MySQL stesso (e, in alcuni casi, e` incompatibile
anche con se stesso)
Enrico

 nel caso i valori non siano uguali, si avra` una data-roulette.
alla faccia dell'ottimizzazione ;^)
bye!

[...]
Perchè? Se per ogni codice cod_pazi c'e' sempre lo stesso cod_fisc,
non è un problema se fai il group by anche per quel campo (o a quel
punto lo puoi fare direttamente solo per cod_fisc, dato che sarebbero
entrambi campi chiave).
Il campo cod_pazi è la chiave univoca, il cod_fisc no...........
Se invece per ogni cod_pazi può esistere più di un cod_fisc, che
risultato ti aspetti? Che scelga il primo? in base a quale
ordinamento? Che scelga a caso? Che ti venga fuori una tupla per ogni
eventuale diverso valore di cod_fisc?
Mi aspetto di trovare due codici pazienti diversi con lo stesso codice 
fiscale, in tal caso c'è stato un errore di inserimento.
Non vedo perchè dovrebbe scegliere, semplicemente mi elenca tutti i codici 
fiscali raggruppati per codice.......
Ovviamente potrei ottenere lo stesso risultato in modo diverso, ma ho solo 
citato un esempio, a prescindere dall'utilità oggettiva,
semplicemente per dimostrare che ciò che fa mySql PostgreSql non lo 
fa........
[...]
Senza offesa, mi sembra che la lunga frequentazione con mysql un
problema te l'abbia comportato: non hai capito come si usa la group
by... ;^)
bye!
Senza offesa, ma forse non hai mai usato mySql e non ne conosci le 
potenzialità............nè tantomeno la sua group by......
Ciao.
                    Francesco 

 potenzialità............nè tantomeno la sua group by......
Ma figurati se mi offendo. Continua pure a divertirti come più ti
aggrada...
bye!

 select codice,cognome,nome,numero group by codice
...e MySql ti dara` UN nominativo a caso per ciascun gruppo di codice,
e non il codice di OGNI nominativo come hai detto!
Il motivo per cui lo standard SQL ti obbliga ad esplicitare le
colonne del group by, e` perche` ci sono, precisamente, solo
due possibilita`: O raggruppare O aggregare (tramite formula).
Risulta evidente che se non raggruppo, DEVO specificare come aggregare;
lo scopo della maggiore prolissita` e` evitare dimenticanze o ambiguita`
(e mi sembra che quella sopra ne sia un esempio). 

 ha scritto nel messaggio 
news:KG%Rj.68072$FR.2...@twister1.libero.it...

No, essendo il codice una chiave primaria non duplicabile, avrò un elenco di 
tutti i codici con il corrispondente codice fiscale.
L'elenco sarà completo perchè il raggruppamento è fatto, appunto sul codice.
Resta inteso che era un esempio banale e poco realistico, dal momento che 
potrei ottenere lo stasso risultato in diversi modi,
ma era fatto solo per spiegare che posso ottenere un raggruppamento per un 
campo X ed affianco un altro campo Y senza doverlo
per forza inserire nel group by.............con mySql, cosa non possibile 
con PostgreSql.
Tutto ciò aldilà di ogni disquisizione del perchè uno debba o meno 
utilizzare query che possono sembrare assurde.......
Se è proprio necessario posso andare a cercare una query reale, ma dovrei 
anche elencare le tabelle interessate e mi sembra
complicato quanto inutile, visto che era solo per esprimere un 
concetto.........
Ciao.
                        Francesco 

 ma dovrei anche elencare le tabelle interessate
Fai un piccolo esempio, se lo ritieni. 

 per codice.......
Supponendo che questa sia la tabella d'origine contenente un errore
da trovare:
CF    |nome    |cognome  |Cod_paz
---------------------------------
lbrsrd|Alberto |Sordi    |p001
dwgfnc|Edwige  |Fenech   |p002
lbrsrd|Alberto |Sordi    |p003
l'applicazione della query sopra riportata mi dara`:
CF    |Count
------------
lbrsrd| 1
dwgfnc| 1
lbrsrd| 1
...per il motivo che Cod_paz e` chiave e quindi e` univoco per
definizione.

 potenzialitŕ............nč tantomeno la sua group by......
Come e` stato gia` detto, il termine corretto non e` "potenzialita`", ma
"pericolosita`". A questo punto tanto varrebbe estrarre i dati lanciando
un dado
Enrico