Certo, il tuo ragionamento è corretto ma prevede di calcolare a priori le intersezioni, una cosa che non mi piace affatto. Vado a perdere tutti i vantaggi dell'uso di sql, inoltre per query eneromemente più complesse la cosa è improponibile.
Come scrivevo prima ho temporaneamente risolto usando:
codice:
select sum(valore),
case(1)
WHEN (orario>='09.00.00' and orario<'10.30.00') THEN 'fascia1'
ELSE NULL END
as fascia_oraria
from tabella1
where (orario>='09.00.00' and orario<'10.30.00')
group by fascia_oraria
union
select sum(valore),
case(1)
WHEN (orario>='10.00.00' and orario<'11.00.00') THEN 'fascia2'
ELSE NULL END
as fascia_oraria
from tabella1
where (orario>='10.00.00' and orario<'11.00.00')
group by fascia_oraria
Ma anche in questo modo la query si complica in maniera esagerata, nel senso che si complica la parte php che la genera e, complicando la query con molte altre condizioni che si intersecano, sarei costretto a creare una combinazione esponenziale di "union". Per ora tutto il progetto è stato fatto in questo modo, che tutto sommato regge. Ma con il complicarsi delle cose e l'aggiunta di nuove condizioni mi rendo conto che sarebbe meglio cambiare le cose. (alcune cose sono proprio impossibili finche vado avanti cosi)
Quello che chiedo è: qualcuno saprebbe indicarmi un metodo completamente diverso per eseguire la query che ho chiesto? Un metodo che non sfrutti il "case" e che in qualche modo mi permetta di usare sql per ottenere "2 volte lo stesso risultato" tramite group by.
Grazie 
EDIT: in questo ultimo esempio si può togliere il "case" dato che c'è una sola condizione sempre vera, ovviamente non cambia niente...