I want to check for three columns if a certain condition holds. Next, I want to sum these three booleans and check whether they are the same as a value in a fourth column.
SELECT SUM(CASE WHEN column1 LIKE 'D%' THEN 1 ELSE 0 END) AS bool1
SUM(CASE WHEN column2 LIKE 'D%' THEN 1 ELSE 0 END) AS bool2
SUM(CASE WHEN column3 LIKE 'D%' THEN 1 ELSE 0 END) AS bool3
FROM table
WHERE bool1 bool2 bool3 = column4
This gives an error however. How should I change the query?
CodePudding user response:
Aggregate function SUM()
operates on all values of a column, so it does not make sense to compare it to a specific value of another column.
I suspect that you want something like this:
SELECT *
FROM tablename
WHERE (column1 LIKE 'D%') (column2 LIKE 'D%') (column3 LIKE 'D%') = column4
Each of the boolean expressions columnX LIKE 'D%'
evaluates to 0
for false
and 1
for true
.
If there are null
s in the columns change to:
WHERE COALESCE(column1 LIKE 'D%', 0)
COALESCE(column2 LIKE 'D%', 0)
COALESCE(column3 LIKE 'D%', 0) = column4
CodePudding user response:
You can try to use HAVING
because you are judged by an aggregate function that can't use alias in where
otherwise you can try to use a subquery.
SELECT SUM(CASE WHEN column1 LIKE 'D%' THEN 1 ELSE 0 END) AS bool1,
SUM(CASE WHEN column2 LIKE 'D%' THEN 1 ELSE 0 END) AS bool2,
SUM(CASE WHEN column3 LIKE 'D%' THEN 1 ELSE 0 END) AS bool3
FROM table
HAVING
SUM(CASE WHEN column1 LIKE 'D%' THEN 1 ELSE 0 END)
SUM(CASE WHEN column2 LIKE 'D%' THEN 1 ELSE 0 END)
SUM(CASE WHEN column3 LIKE 'D%' THEN 1 ELSE 0 END) = column4