HAVING

Filter groups.

WHERE filters rows before grouping. HAVING filters groups.

Goal

Keep cities whose total units are at least 10.

import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t (city TEXT, units INTEGER)")
con.executemany("INSERT INTO t VALUES (?, ?)", [("Nairobi", 12), ("Nairobi", 7), ("Kisumu", 3), ("Mombasa", 9)])
print(con.execute("SELECT city, SUM(units) AS u FROM t GROUP BY city HAVING u >= 10").fetchall())
con.close()
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t (city TEXT, units INTEGER)")
con.executemany("INSERT INTO t VALUES (?, ?)", [("Nairobi", 12), ("Kisumu", 3), ("Kisumu", 2)])
print(con.execute("SELECT city, COUNT(*) FROM t GROUP BY city HAVING COUNT(*) > 1").fetchall())
con.close()
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t (city TEXT, units INTEGER)")
con.executemany("INSERT INTO t VALUES (?, ?)", [("Nairobi", 12), ("Kisumu", 3)])
print(con.execute("SELECT city, units FROM t WHERE units >= 10").fetchall())
con.close()
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t (city TEXT, units INTEGER)")
con.executemany("INSERT INTO t VALUES (?, ?)", [("Nairobi", 1), ("Nairobi", 2), ("Eldoret", 8)])
print(con.execute("SELECT city, SUM(units) FROM t GROUP BY city HAVING SUM(units) BETWEEN 3 AND 10").fetchall())
con.close()