abbastanza semplice da capire:
WHERE '$from' BETWEEN '$from' AND '$to'
Sara' sempre TRUE poiche' $from di sicuro sara' SEMPRE tra $from and $to
l'altro problema e' che con group by ottieni una sola riga e, per inciso, sara' la prima che fisicamente incontra nella tabella, mentre senza il raggruppamento ne estrarra' due essendo $from sempre vero. In questo caso vai a sovrascrivere l'array avendo un indice fisso numerico [0] e quindi vedi solo l'ultimo record set trovato
$ratestable[$row['room_type']][0]=$row['total'];