I’m trying to count the 3 different values that a column in a table can take, in a single SELECT. What am I doing wrong?
with cls.getDictCursor() as cur: cur.execute("SELECT s.matricola,r.lingua, r.livello,COUNT (CASE WHEN tipoProva=0 THAN 1) AS testInformatizzato, COUNT (CASE WHEN tipoProva=1 THAN 1) AS provaScritta, COUNT (CASE WHEN tipoProva=2 THAN 1) AS provaOrale FROM risultatoprovacla AS r JOIN studentecla AS s ON s.id = r.id_risultatocladistu_studentecla WHERE s.matricola ILIKE %s GROUP BY s.matricola,r.lingua,r.livello ORDER BY r.lingua;", (matricola,))
I am using a postgresql table where the column named “tipoprova” is an integer
Advertisement
Answer
You are looking for filtered aggregation:
SELECT s.matricola,r.lingua, r.livello, COUNT(*) filter (where tipoProva=0) AS testInformatizzato, COUNT(*) filter (where tipoProva=1) AS provaScritta, COUNT(*) filter (where tipoProva=2) AS provaOrale FROM risultatoprovacla AS r JOIN studentecla AS s ON s.id = r.id_risultatocladistu_studentecla WHERE s.matricola ILIKE %s GROUP BY s.matricola,r.lingua,r.livello ORDER BY r.lingua;
Your query is wrong, because you have the wrong syntax for the CASE expression. It needs to be THEN
not THAN
and it also needs to be ended with END
, e.g.:
COUNT(CASE WHEN tipoProva=1 THEN 1 END) AS provaScritta
would be the correct syntax