Ver Mensaje Individual
  #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
Reputación: 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