He traducido tu SQL utilizando JOINs.
Código SQL
[-]
Select SUM(dhr.kmrecorrido), SUM(co.consumo), c.nocarro, c.indicecons
from carro c
join consumo co
on c.idcarro=co.idcarro
join hojaruta hr
on c.idcarro=hr.idcarro
join deschojaruta dhr
on dhr.idhojaruta=hr.idhojaruta
Where
co.fecha between :binicio and :bfin and
dhr.fecha between :binicio and :bfin
Group By c.nocarro, c.indicecons
Order By c.nocarro
El probelma, me parece, radica en que no tienes unido de ninguna manera el consumo con hojaruta.
En este caso, el SELECT te devolverá todos los elementos de consumo y todos los elementos de hojaruta y todas sus posibles combinaciones.
Si luego de filtrar entre fechas obtienes:
consumo (1, 2, 3)
hojaruta (a, b, c)
El select te devolverá:
(1-a, 1-b, 1-c, 2-a, 2-b, 2-c, 3-1, 3-b, 3-c)
Supongo que la mejor opción, puesto que no hay relación entre consumo y hojaruta es hacer dos SELECTs dentro de uno:
Algo así:
Código SQL
[-]
Select c.nocarro, c.indicecons,
(
select SUM(dhr.kmrecorrido) from hojaruta hr
on c.idcarro=hr.idcarro
join deschojaruta dhr
on dhr.idhojaruta=hr.idhojaruta
dhr.fecha between :binicio and :bfin
) as kmrecorrido,
(
select SUM(co.consumo) from consumo co
on c.idcarro=co.idcarro
co.fecha between :binicio and :bfin and
) as consumo
from carro c
Order By c.nocarro