distinct si estende a tutti i campi elencati nella SELECT:

select distinct pallo, pippo, pallino vuol dire che se uno dei tre campi differisce dal precedente formera' un nuovo record nel result set.

Quindi:
ciccio, ciccio1, ciccio1
ciccio, ciccio2, ciccio1
ciccio, ciccio1, ciccio2
sono tutti record diversi tra loro ed il distinct li stampa tutti e tre. In pratica ti evita solo i record completamente "doppioni".

il group by invece "raggruppa" i risultati a seconda di un campo e quindi NON ti rende la lista completa ma solo un record "con i valori raggruppati" oppure UN SOLO record casuale se i campi non sono raggruppati da una funzione di aggregazione come count(), sum(), max() ecc.