Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-09-2012
Salnhack Salnhack is offline
Miembro
NULL
 
Registrado: oct 2011
Ubicación: Cuba
Posts: 71
Poder: 13
Salnhack Va por buen camino
Unhappy Ayuda con consulta

Hola a todos
escribo para ver quien me puede ayudar

tengo 4 tablas

carro
idcarro nocarro indicecons
1 TSA-590 10
2 TSA-250 20

hojaruta
idhojaruta idcarro nohojatuta chofer
1 1 150 Juan
2 2 151 Pedro

deschojaruta
iddeschojaruta idhojaruta origen destino kmrecorrido fecha
1 1 Las Tunas Holguin 74 1/09/2012
2 1 Holguin Las Tunas 74 1/09/2012
3 2 Las Tunas Santuago 204 2/09/2012

consumo
idconsumo idcarro consumo chip fecha
1 1 10 150 1/09/2012
2 2 50 12 1/09/2012
3 1 10 20 2/09/2012
4 2 10 25 2/09/2012
5 2 40 50 3/09/2012


necesito hacer una consulta que me selecione por carro los km recorrido y el consumo en un rango de fecha 1/9/2012-30/9/2012
algo asi

carro indicecons kmrecorrido consumo

TSA-590 10 148 20

TSA-250 20 204 100
este es el resultado que me deveria dar

y estoy utilizando esta consulta
Código Delphi [-]
     SQL.Add('Select SUM(deschojaruta.kmrecorrido),SUM(consumo.consumo), carro.nocarro, carro.indicecons from deschojaruta,carro, hojaruta, consumo');
     SQl.Add('Where deschojaruta.fecha between :binicio and :bfin and deschojaruta.idhojaruta=hojaruta.idhojaruta and hojaruta.idcarro=carro.idcarro and consumo.fecha between :binicio and :bfin and carro.idcarro=consumo.idcarro');
     SQL.Add('Group By carro.nocarro, carro.indicecons');
     SQL.Add('Order By carro.nocarro');
pero me devuelve los resultados incorrectamente
Responder Con Cita
  #2  
Antiguo 12-09-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 13-09-2012
Salnhack Salnhack is offline
Miembro
NULL
 
Registrado: oct 2011
Ubicación: Cuba
Posts: 71
Poder: 13
Salnhack Va por buen camino
hola duilioisola
he probado el codigo que me sugeriste pero me da error en sintaxis
Responder Con Cita
  #4  
Antiguo 13-09-2012
hoyosfelix hoyosfelix is offline
Miembro
 
Registrado: ago 2010
Ubicación: San Antonio, Paraguay
Posts: 38
Poder: 0
hoyosfelix Va por buen camino
Respuesta "Ayuda con consulta"

Buen día Salnhack, te paso un select para probar

SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)
FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO
INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA
INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO
WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2
GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS
ORDER BY C.IDCARRO


Saludos...

Última edición por hoyosfelix fecha: 13-09-2012 a las 18:10:13.
Responder Con Cita
  #5  
Antiguo 13-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por hoyosfelix Ver Mensaje
...
Recuerda poner los tags al código fuente, ejemplo:



Y te ahorras todo el trabajo que has hecho poniendo colores por palabras, tipos de letras, etc.

Gracias
Responder Con Cita
  #6  
Antiguo 13-09-2012
hoyosfelix hoyosfelix is offline
Miembro
 
Registrado: ago 2010
Ubicación: San Antonio, Paraguay
Posts: 38
Poder: 0
hoyosfelix Va por buen camino
Respuesta "Ayuda con consulta"

Buena tarde,
Gracias por el consejo.
Realmente, intenté resaltar la sintaxis de SQL, pero no entendía muy bien cómo funcionaba, ahora me quedó claro.
En la próxima entrada voy a utilizar correctamente los tag's.
Saludos.
Responder Con Cita
  #7  
Antiguo 13-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Gracias
Responder Con Cita
  #8  
Antiguo 13-09-2012
Salnhack Salnhack is offline
Miembro
NULL
 
Registrado: oct 2011
Ubicación: Cuba
Posts: 71
Poder: 13
Salnhack Va por buen camino
Cita:
Empezado por hoyosfelix Ver Mensaje
Buen día Salnhack, te paso un select para probar

SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)
FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO
INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA
INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO
WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2
GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS
ORDER BY C.IDCARRO


Saludos...
Hola hoyofelix he probado tu codigo pero me da error en sintaxis falta operador
tengo poco conocimiento de SQL solo lo basico por eso me resulta dificil lograr el resultado que espero
Responder Con Cita
  #9  
Antiguo 13-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Salnhack Ver Mensaje
Hola hoyofelix he probado tu codigo pero me da error en sintaxis falta operador
tengo poco conocimiento de SQL solo lo basico por eso me resulta dificil lograr el resultado que espero
Ayuda a que te ayudemos
Se parará en una línea, indicará algo más, el mensaje completo y exacto dirá otra cosa, pégalo aquí... no somos adivinos
Responder Con Cita
  #10  
Antiguo 13-09-2012
hoyosfelix hoyosfelix is offline
Miembro
 
Registrado: ago 2010
Ubicación: San Antonio, Paraguay
Posts: 38
Poder: 0
hoyosfelix Va por buen camino
Respuesta "Ayuda con consulta"

Hola,
Para verificar que la consulta traiga algún resultado se debe probar primero en una herramienta de SQL, por ejemplo el FlameRobin.
Allí en vez de :fecha1 y :fecha2 podés cambiar por un rango que tengas en tu tabla consumo, ejemplo:

Código SQL [-]
SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO) 
FROM CARRO C 
INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO   
INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA   
INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO 
WHERE CO.FECHA BETWEEN '2012-09-01' AND '2012-09-30' 
GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS 
ORDER BY C.IDCARRO

Si devuelve un resultado significa que la consulta está correcta y luego ya se puede pasar al SQL de tu componente Query en Delphi.
Es cierto lo que dice Casimiro Notevi, sería interesante saber en dónde estás corriendo la consulta, si en Delphi, en FlameRobin u otro; si tuvieramos más datos podríamos ir directo al problema.

Saludos.

Última edición por Casimiro Notevi fecha: 13-09-2012 a las 22:28:21.
Responder Con Cita
  #11  
Antiguo 13-09-2012
Salnhack Salnhack is offline
Miembro
NULL
 
Registrado: oct 2011
Ubicación: Cuba
Posts: 71
Poder: 13
Salnhack Va por buen camino
La consulta la estoy corriendo en deplhi y el error que me muestra es el que adjunto
Imágenes Adjuntas
Tipo de Archivo: jpg ERROR SQL.JPG (34,3 KB, 13 visitas)
Responder Con Cita
  #12  
Antiguo 13-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Parece que no has tecleado bien la consulta, ¿puede ser?, pon el código que lo veamos.
Seguimos sin ser adivinos
Responder Con Cita
  #13  
Antiguo 13-09-2012
Salnhack Salnhack is offline
Miembro
NULL
 
Registrado: oct 2011
Ubicación: Cuba
Posts: 71
Poder: 13
Salnhack Va por buen camino
este es el codigo completo que le paso al query

Código Delphi [-]
   with datamodule29.Query2 do
    Begin
     Close;
     SQl.Clear;
     SQL.Add('Select idmes from mes where mes=mes');
     ParamByName('pmes').AsString:=suiDBLookupComboBox2.Text;
     Open;
     mes:=FieldByName('idmes').AsInteger;
     Close;
     SQl.Clear;
     SQL.Add('Select * from mes where idmes=idmes');
     ParamByName('pidmes').AsInteger:=mes;
     Open;
     inicio:=FieldByName('inicio').AsString;
     fin:=FieldByName('fin').AsString;
     Close;
     SQL.Clear;
     SQL.Add('SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)');
     SQL.Add('FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO');
     SQL.Add('INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA');
     SQl.Add('INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO');
     SQL.Add('WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2');
     SQL.Add('GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS');
     SQL.Add('ORDER BY C.IDCARRO');
     ParamByName('FECHA1').AsString:=inicio;
     ParamByName('FECHA2').AsString:=fin;
     Open;
    end;
Responder Con Cita
  #14  
Antiguo 13-09-2012
hoyosfelix hoyosfelix is offline
Miembro
 
Registrado: ago 2010
Ubicación: San Antonio, Paraguay
Posts: 38
Poder: 0
hoyosfelix Va por buen camino
Respuesta "Ayuda con consulta"

Hola, prueba de esta manera:

Código Delphi [-]
var    
vsql : string;  

begin   
  ....   
  vsql := ' SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO) ';   
  vsql := vsql + ' FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO ';   
  vsql := vsql + ' INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA ';   
  vsql := vsql + ' INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO ';    
  vsql := vsql + ' WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2 ';   
  vsql := vsql + ' GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS ';   
  vsql := vsql + ' ORDER BY C.IDCARRO ';     
  SQL.Add(vsql);    
  ParamByName('FECHA1').AsString:=inicio;   
  ParamByName('FECHA2').AsString:=fin;   
  Open; 
end

Fijate en los espacios al inicio y final de cada vsql, eso te asegura que al concatenar tengas separada tu sql.

Saludos.

Última edición por Casimiro Notevi fecha: 13-09-2012 a las 23:43:51. Razón: Aparece en una sola línea, no formatea al estilo Delphi.
Responder Con Cita
  #15  
Antiguo 13-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ves, así es más fácil, es que no tenemos bola mágica
Código Delphi [-]
SQL.Add('SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO)');      
SQL.Add('  FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO');      
SQL.Add('  INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA');      
SQL.Add('  INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO');      
SQL.Add('  WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2');      
SQL.Add('  GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS');      
SQL.Add('  ORDER BY C.IDCARRO');

Te falta poner un espacio antes o después, como quieras, en cada línea, para que luego no queden todas "pegadas"

EDITO: Lo que ha dicho hoyosfelix, no lo había visto.
Responder Con Cita
  #16  
Antiguo 13-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
hoyosfelix, para que no salga el código "hecho un desastre" te aconsejo que primero envies el mensaje y seguidamente lo edites. El problema es que si le das a "previsualizar" antes de "enviar", se descuadra como te ha salido a ti.

Le tenemos que dar un repaso a la configuración del vbulletin
Responder Con Cita
  #17  
Antiguo 13-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Te falta poner un espacio antes o después, como quieras, en cada línea, para que luego no queden todas "pegadas"
Eso no es necesario, pues quedan en líneas distintas.

// Saludos
Responder Con Cita
  #18  
Antiguo 13-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Eso no es necesario, pues quedan en líneas distintas.
// Saludos
Cierto, solamente hace falta cuando se usa el método escrito por hoyosfelix.
Me he confundido porque yo suelo usar sql.text:
Código Delphi [-]
query.sql.text := 'select *' +
'  from tabla'+
'  where algo';
Responder Con Cita
  #19  
Antiguo 14-09-2012
Salnhack Salnhack is offline
Miembro
NULL
 
Registrado: oct 2011
Ubicación: Cuba
Posts: 71
Poder: 13
Salnhack Va por buen camino
Unhappy

Hola a todos he probado la via de hoyosfelix pero me sigue dando el mismo error

Error en sintaxis falta operador

http://clubdelphi.com/foros/attachme...9&d=1347566837

Última edición por Salnhack fecha: 14-09-2012 a las 15:04:33.
Responder Con Cita
  #20  
Antiguo 14-09-2012
hoyosfelix hoyosfelix is offline
Miembro
 
Registrado: ago 2010
Ubicación: San Antonio, Paraguay
Posts: 38
Poder: 0
hoyosfelix Va por buen camino
Respuesta "Ayuda con consulta"

Buen día, vamos por paso.
1º Quiero saber si la consulta funciona, favor probar en el diseñador de consulta SQL de Access, ejecutarlo y ver resultados.
2º Podriamos ver de nuevo tu sintaxis en Delphi.
3º En tu form poner 2 componentes TDateTimePicker que se llamen fecha1 y fecha2, que vamos a pasar como parámetro a tu consulta.
4º Luego, reemplazar tu código actual por el siguiente, ya que veo en el código anterior que las variables que se pasan a la SQL no son fechas, son enteros pero no fecha de la forma '01/09/2012' y el SQL te lanza el error ya que espera una fecha válida.

Código SQL [-]
var    
  vsql : string;  
begin        
  vsql := ' SELECT C.IDCARRO, C.NOCARRO, C.INDICECONS, SUM(DHR.KMRECORRIDO), SUM(CO.CONSUMO) ';   
  vsql := vsql + ' FROM CARRO C INNER JOIN HOJARUTA HR ON HR.IDCARRO = C.IDCARRO ';   
  vsql := vsql + ' INNER JOIN DESCHOJARUTA DHR ON DHR.IDHOJARUTA = HR.IDHOJARUTA ';   
  vsql := vsql + ' INNER JOIN CONSUMO CO ON CO.IDCARRO = C.IDCARRO ';    
  vsql := vsql + ' WHERE CO.FECHA BETWEEN :FECHA1 AND :FECHA2 ';   
  vsql := vsql + ' GROUP BY C.IDCARRO, C.NOCARRO, C.INDICECONS ';   
  vsql := vsql + ' ORDER BY C.IDCARRO ';     

  SQL.Close;
    SQL.Clear;
    SQL.Add(vsql);    
    Query.Params.Items[0].AsDate:=fecha1.Date;
    Query.Params.Items[1].AsDate:=fecha2.Date;
  SQL.Open; 
end

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda con consulta SQL n03l SQL 4 18-04-2007 22:03:40
Ayuda con consulta raco Varios 6 06-04-2005 02:14:25
Ayuda con consulta SQL tgsistemas SQL 9 18-02-2004 16:14:07
Ayuda con consulta JorgeBec SQL 7 21-10-2003 20:25:16
ayuda en consulta bismarito Firebird e Interbase 1 29-07-2003 00:40:45


La franja horaria es GMT +2. Ahora son las 03:37:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi