MySQL que tiene SUM (columna 1) columna 2 no funciona

Estoy trabajando en una consulta que tiene que comparar una suma de elementos de una tabla unida con un valor de un campo de la tabla "principal". Aquí está la esencia de mi consulta:

SELECT t1.id
FROM table1 AS t1
INNER JOIN table2 t2 ON t2.t1_id = t1.id -- AND OTHER CONDITIONS
-- WHERE more t1 conditions
GROUP BY t1.id
HAVING SUM(t2.amount) <> t1.total_amount
AND SUM(t2.amount) = (t1.component1+t1.component2+t1.component3+t1.component4);

Da como resultado: ERROR 1054 (42S22): Columna desconocida 't1.total_amount' en 'tener cláusula' No hace falta decir que el campo existe en t1 y no hubo errores tipográficos (cuadrado lo verificó, al borde de la locura aquí).


No puedo por mi vida averiguar qué está mal aquí. Intenté buscar SO ya y la mayoría de los problemas se deben a que las personas usan HAVING en lugar de WHERE, pero dado que estoy usando SUM(), creo que este es el camino correcto.


EDITAR: la respuesta de Terje fue la más precisa, aunque logré lograrlo sin usar esa sintaxis en (posiblemente la oración de actualización más estúpida de todos los tiempos) mi oración de actualización, que fue (estúpido, no intentes esto en casa a menos que todo de lo contrario falla):

UPDATE t1
SET t1.total_amount = 
(
  SELECT SUM(t2.amount) 
  FROM table 2
  --WHERE, AND 
  GROUP BY t1.id
  HAVING SUM(t2.amount) <> t1.total_amount
  AND SUM(t2.amount) = (t1.component1+t1.component2+t1.component3+t1.component4)
)
WHERE t1.id IN (same awful subquery as before, except selecting t2.t1_id)
--AND other conditions
;

PD: El objetivo final aquí es usar las mismas condiciones de tener en una oración de actualización Muchas gracias de antemano, -Lauri

preguntado el 09 de marzo de 13 a las 14:03

2 Respuestas

Para comparar con t1.total_amount tendrás que agregarlo a la GROUP BYcláusula, o para comparar con, por ejemplo, min(total_amount). A medida que se agrupa por t1.id no importa qué función agregada de total_amount esté utilizando.

respondido 09 mar '13, 14:03

Hmm, esta idea podría ser mejor para mi solución final. ¡Gracias, Terje! Cuando logre que funcione en la actualización, se seleccionará su respuesta. - lauri p

HAVING y GROUP BY solo funciona en las cosas que realmente está seleccionando, a diferencia del WHERE y ORDER BY cláusulas. Por lo tanto, debe seleccionar total_amount, Me temo que. Además, la sintaxis es '!=' para desigual en MySQL. (Estoy corregido, '<>' está bien en MySQL).

Piensa en WHERE y ORDER BY como su manipulación de las tablas de las que está seleccionando, y HAVING y GROUP BY como manipular los datos que ahora tiene.

respondido 09 mar '13, 15:03

De acuerdo, seleccionar el campo parece haber funcionado, excepto que ahora obtengo un conjunto vacío, donde debería obtener resultados. Sin embargo, esto podría ser de mi parte, te responderé al respecto. Gracias por la idea, Svip. Sin embargo, una nota importante, <> funciona bien;). - lauri p

Vaya. Bueno, eliminaré esa nota de la respuesta entonces. - Svip

Sí, los conjuntos vacíos se debieron a mi propia estupidez. Sin embargo, no sé por qué alguien haría -1 en su respuesta, ya que fue el primero y mayormente en el punto. - lauri p

Tal vez alguien esté celoso. pero así es como HAVING y GROUP BY obras. De todos modos, me complace ayudar. - Svip

@swip Su respuesta todavía contiene errores: puede group by campos que no seleccione, y order by se hace despues group byy having. Sin embargo, el -1 no era mío. - Terje D.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.