Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Error de Sintaxis al Insertar datos a una tabla desde otra (https://www.clubdelphi.com/foros/showthread.php?t=35975)

alastor 27-09-2006 20:21:03

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

roman 27-09-2006 20:47:36

Sobra un paréntesis al principio del SELECT.

// Saludos

Caral 27-09-2006 21:00:45

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

roman 27-09-2006 21:23:58

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

Caral 27-09-2006 21:26:30

Gracias Roman
Desconocia que se podia utilizar asi.
Apuntado y gracias
Saludos
.

alastor 28-09-2006 16:30:56

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

Caral 28-09-2006 17:12:03

Hola
Estas seguro que ID esta en la tabla Demandas Territoriales?
Saludos

roman 28-09-2006 17:17:51

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

Caral 28-09-2006 17:26:35

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.:D
Saludos

alastor 28-09-2006 18:27:09

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.


La franja horaria es GMT +2. Ahora son las 04:07:40.

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