Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2006
Avatar de alastor
alastor alastor is offline
Miembro
 
Registrado: abr 2006
Posts: 59
Poder: 19
alastor Va por buen camino
Error de Sintaxis al Insertar datos a una tabla desde otra

Hola
______________
Amigos he estado haciendo una sistema y ma he topado con el sgte problema:
Nesecito agregar los datos que obtenga de una consulta en otra tabla para lo que use la sgte sintaxis en un ADOQuerry:
Código SQL [-]
INSERT INTO etgen1 (Id, Etapa, Destino, Producto, Necesidadgen, imp_necgen, Asignaciongen, imp_asiggen, dif_cantgen, dif_impgen, Porcientogen)
SELECT (Id, Etapa, Destino, Producto, SUM(Necesidad), SUM(imp_nec), SUM(Asignacion), SUM(imp_asig), SUM(dif_cant), SUM(dif_imp), Porciento FROM [Demandas Territoriales] 
WHERE  Etapa='1' and destino=ds and producto=pd
Donde la tabla "etgen1" es donde voy a copiar lo que me devuelva la consulta SELECT ... que hace sumatorias sobre algunos de los campos de la tabla "Demandas Territoriales". "ds" y "pd" son parametro por los que filtro la tabla "Demandas Territoriales".
Esta consulta me devuelve un error al querer agregar los campos al ADOQuerry.
Si alquien pudiece ayudarme se lo agradeceria.
___________________
Saludos

Última edición por alastor fecha: 27-09-2006 a las 20:23:24.
Responder Con Cita
  #2  
Antiguo 27-09-2006
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
Sobra un paréntesis al principio del SELECT.

// Saludos
Responder Con Cita
  #3  
Antiguo 27-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Efectivamente sobra un parentesis como dice Roman, pero ademas veo que Insertas antes del select, creo que va asi:
Código SQL [-]
SELECT Id, Etapa, Destino, Producto, SUM(Necesidad), SUM(imp_nec), SUM(Asignacion), SUM(imp_asig), SUM(dif_cant), SUM(dif_imp), Porciento FROM [Demandas Territoriales] 
WHERE  Etapa='1' and destino=ds and producto=pd
INSERT INTO etgen1 (Id, Etapa, Destino, Producto, Necesidadgen, imp_necgen, Asignaciongen, imp_asiggen, dif_cantgen, dif_impgen, Porcientogen)
A mi parecer primero tienes que hacer la consulta y luego la insertas, con el resultado de la misma.
Saludos
Responder Con Cita
  #4  
Antiguo 27-09-2006
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
Bueno no, la sintaxis es correcta:

Código SQL [-]
insert into tabla
(field1, field2, ...)
select field1, field2, ...
from otra tabla

es decir, en lugar de VALUES, se coloca una consulta SELECT.

// Saludos
Responder Con Cita
  #5  
Antiguo 27-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Gracias Roman
Desconocia que se podia utilizar asi.
Apuntado y gracias
Saludos
.
Responder Con Cita
  #6  
Antiguo 28-09-2006
Avatar de alastor
alastor alastor is offline
Miembro
 
Registrado: abr 2006
Posts: 59
Poder: 19
alastor Va por buen camino
Gracias a todos por sus respuestas. Ahora el error no se encuentra en al sintaxis, dice esactamente asi:
Código Delphi [-]
Ha intentado ejecutar una consulta que no incluye la expresion especificada 'Id' como parte de una funsion de agregado.
¿Alguna sugerencia????
_____________________
Saludos
Responder Con Cita
  #7  
Antiguo 28-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Estas seguro que ID esta en la tabla Demandas Territoriales?
Saludos
Responder Con Cita
  #8  
Antiguo 28-09-2006
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
En consultas INSERT..SELECT siempre es más sano trabajar primero la parte SELECT para cerciorarnos de que funciona bien y da los resultados que esperamos.

Vamos a ver, suponte- simplificando al extremo -que tienes tu tabla así:

Código:
  id |  importe
-----+---------
  84 |    750
  32 |    400
  45 |    300
  66 |    250
  09 |    900
  66 |    250
Tu consulta SELECT se parece a ésta:

Código SQL [-]
select id, sum(importe) from tabla
where id > 50

(el condicional es lo de menos, sólo para ejemplificar). ¿Qué esperas de esta consulta? ¿Cómo piensas que van a ser el o los registros resultantes?

Por un lado tienes la función SUM aplicada sin cláusula GROUP BY, así que aplicará sobre todos los registros que satisfagan la condición:

Código:
  id |  importe
-----+---------
  84 |    750
  66 |    250
  66 |    250
Esto te da un sólo resultado: 1250, así que sólo obtendrás un registro. Pero tú quieres también listar el campo id. Pero hay tres: 84 y 66 (dos veces) y un sólo registro. ¿Cuál pones?

No hay forma de saberlo y de ahí el mensaje que estás recibiendo.

Si agrupases por id:

Código SQL [-]
select id, sum(importe) from tabla
where id > 50
group by id

entonces primero se agrupan los registros que satisfacen la condición:


Código:
  id |  importe
-----+---------
  84 |    750
-----+---------
  66 |    250
     |    250
y se aplica la función SUM a cada grupo. Para el grupo id=84 obtienes la suma 750 y para el grupo id=66 obtienes la suma 500. Así tienes dos sumas y dos registros (correspondientes a los dos grupos) y lo que obtienes es:

Código:
  id | sum(importe)
-----+------------
  84 |    750
  66 |    500
En términos generales, cuando aplicas una función agregada (como SUM), los campos que aparecen en el SELECT, también deben aparecer en el GROUP BY. Así, la función se aplica sobre cada grupo y obtienes un resultado por grupo y éso es lo que se lista.

Lo mismo- claro está -va a suceder con los otros campos que listas: ETAPA, DESTINO, PRODUCTO.

// Saludos

Última edición por roman fecha: 28-09-2006 a las 17:25:17.
Responder Con Cita
  #9  
Antiguo 28-09-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Huuuy Roman
En donde das clases aparte de aqui, yo me apunto, Eres un verdadero Maestro, el que no aprende con tigo que se traslade a VB.
Saludos
Responder Con Cita
  #10  
Antiguo 28-09-2006
Avatar de alastor
alastor alastor is offline
Miembro
 
Registrado: abr 2006
Posts: 59
Poder: 19
alastor Va por buen camino
Muchisimas gracias ,Roman, por la clase magistral que acabas de darme. Te aceguro que la tendre en cuenta. Y a ti Caral por tu atencion.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Dbgrid para insertar en una tabla pero cogiendo datos de otra tabla taru MySQL 1 27-07-2006 15:36:12
insertar datos en una tabla desde fichero XML??? mguixot Conexión con bases de datos 2 17-05-2006 16:18:04
Consultar otra tabla desde un Dbgrdid y traerse los datos al Dbgrid alejandroalba Conexión con bases de datos 2 08-05-2006 18:30:42
insertar datos en una tabla desde otra Giniromero SQL 5 17-06-2004 19:37:16
Como insertar datos de una tabla en otra tabla? Salomon Firebird e Interbase 1 28-08-2003 11:29:40


La franja horaria es GMT +2. Ahora son las 10:54:59.


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