Pregunta

Tengo una consulta MySQL como esta:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;

Quiero restringir los resultados a las filas donde Ocurrencias > 0. Esto me parece muy simple, pero parece que no puedo hacer que funcione. No importa lo que intente, WHERE o TENIENDO, cada vez que intento agregar esta restricción no recibo NINGUNA FILA a cambio. Estoy seguro de que hay datos en mi tabla que deberían devolverse. ¿Alguien sabe cómo lograr lo que estoy haciendo?


He intentado esto, pero todavía no funciona. ¿Alguna idea de por qué todavía no funciona?

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
¿Fue útil?

Solución

No estoy tan familiarizado con MySQL como con SQL Server, pero en T-SQL, no se pueden usar alias en las cláusulas GROUP BY (originalmente también pensé en las cláusulas ORDER BY, pero desde entonces se ha demostrado que ser incorrecto) En este caso, desea filtrar en función de los resultados de GROUP BY, por lo que utilizaría una cláusula HAVING de la siguiente manera:

SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
    some_table AS q
WHERE
    criterion = 'value'
GROUP BY
    q.P_id
HAVING
    SUM(... some SQL removed for brevity ...) > 0
ORDER BY
    Occurrences DESC
LIMIT 10;

Otros consejos

Esta consulta funciona para mí ...

select order_id, sum(qty_ordered) as total_qty 
from sales_flat_order_item 
group by order_id 
having total_qty > 10
order by total_qty desc

Ah, he encontrado el lugar para ello.

La declaración es ahora:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;

Parece estar funcionando bien con ORDER BY Ocurrencias,

Creo que los agregados deberían estar en la cláusula HAVING. Aunque, es cierto, no estoy seguro de si se aceptan alias.

HAVING (Occurrences > 0)

HAVING (SUM(...some SQL removed for brevety) > 0)

Alternativamente, puede usar una subconsulta:

SELECT *
FROM (
   -- your current query
) AS sub
WHERE (Occurences > 0)

De acuerdo con el estándar SQL, los alias de columna no están disponibles en el cuerpo de la consulta, lo cual es una molestia confusa. Dado lo que ha intentado, parece que lo mismo ocurre con MySQL (y algunos otros DBMS). Probablemente tendrá que repetir la expresión en la cláusula ORDER BY.

Además, la cláusula GROUP BY debe enumerar todas las columnas que están en *, no solo la clave primaria (aunque, lógicamente, especificar la clave primaria debería ser suficiente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top