TransWikia.com

Error al tratar de comparar dos count en sqlite

Stack Overflow en español Asked by Andres on December 11, 2020

Buen día! Estoy teniendo un problema cuando intento comparar los resultados de dos count distintos, supongamos que tengo una tabla definida de la siguiente forma:

CREATE TABLE piezas(
  id1 INTEGER PRIMARY KEY AUTOINCREMENT,
  id2 INTEGER,
  ruta INTEGER,
  leido INTEGER);

En la cuál quiero realizar la siguiente consulta:

SELECT p.id2, COUNT(p.id2) AS cantidad, (SELECT COUNT(p1.id2) 
  FROM piezas AS p1 WHERE p1.id2 = p.id2) AS total 
FROM piezas AS p 
WHERE p.ruta < 0 OR (p.leido > 0 AND cantidad = total) 
GROUP BY p.id2;

Esta consulta me arroja el error:

"Uncaught Error: misuse of aggregate: COUNT()"

Cómo podría obtener todos los id2 siempre y cuándo su "ruta" sea menor a 0 o que el campo "leido" se mayor a 0 mientras que todos los leídos sean igual a la cantidad total (siendo la cantidad total el recuento de todos los id1 que tengan el mismo id2)

2 Answers

En mi experiencia es recomendable no usar subconsultas, pues baja mucho el rendimiento debido a que se ejecuta por cada elemento de la consulta que la contiene.

Lo más recomendable es tratar de moverla de nivel para usar un JOIN.

Pienso que la consulta final debería quedar así.

SELECT q1.id2, q1.cantidad, q2.total
FROM (
   SELECT p.id2, COUNT(p.id2) AS cantidad
   FROM piezas AS p
   WHERE p.ruta < 0 OR (p.leido > 0) 
   GROUP BY p.id2) q1
INNER JOIN (
   SELECT p2.id2, COUNT(p2.id2) total
   FROM piezas AS p2 
   GROUP BY p2.id2) q2 ON q1.id2 = q2.id2 AND q1.cantidad = q2.total;

Espero que esté bien la consulta final, no tengo manera de probarla en este momento.

Answered by EdgardoO on December 11, 2020

La consulta tiene que tener la condición de igualdad no debería estar en el WHERE sino en el HAVING, quedando la consulta:

SELECT p.id2, COUNT(p.id2) AS cantidad, (SELECT COUNT(p1.id2) 
  FROM piezas AS p1 WHERE p1.id2 = p.id2) AS total 
FROM piezas AS p 
WHERE p.ruta < 0 OR p.leido > 0 
GROUP BY p.id2
HAVING cantidad = total;

Answered by Andres on December 11, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP