I need to find records that equal 0 and have other records that are greater than 0. The result should have at least one record that equals 0 and must also have at least one record that is greater than 0. It is easier to explain it with visuals:
Name amount
a1 0
a1 100
a1 200
a2 0
a2 0
a2 200
a3 200
a3 0
a3 100
It should not look like:
Name amount
a5 100
a5 100
a5 200
a7 0
a7 0
a7 0
a6 200
a6 10
a6 100
I have tried this:
Select name, amount
from table1
where amount = '0' AND amount > '0'
Sorry if this question is a bit ambiguous, it’s rather hard to explain.
Thanks in advance.
NB – Sorry if the question is not clear enough, wasn’t sure how to word it.
Advertisement
Answer
SELECT
will give you rows from the table and the WHERE
applies to those rowsto filter them. So your sample:
Select name, amount from table1 where amount = '0' AND amount > '0'
Will never return any rows because it only returns rows that have both amount = 0 and amount > 0 which is impossible. Also I hope those values are numeric, so you shouldn’t use the single quotes around them (i.e. ‘0’ should be plain 0)
GMB has a good way to do it with partition functions. The subquery reshapes the data into a new resultset that contains new columns ‘min_amount’ and ‘max_amount’ for all rows with the same id along with the other data for each row. You can then filter on those values, although you don’t mention if negative values could be present.
Another way to do it would be to add the checks to your filter criteria:
select name, amount
from table1 a
where a.id in (select id from table1 where amount = 0)
and a.id in (select id from table1 where amount > 0)
This selects rows where id is in the list of ids with 0 as amount and the list of ids with amounts > 0.