Reputation: 11
I have a table named discounts. Within this table I have a account number, discount number, a discount status, a discount start and discount end date. I would like to find all records for account numbers with count of discount as 1 and that discount has end dates not equal to zero.
This is how the table looks like:
| account no | discount no | status | end date |
| 14188971 | 111 | 1 | 12-DEC-23 |
| 14188971 | 111 | 1 | 0 |
| 16743289 | 111 | 1 | 0 |
| 19908543 | 111 | 1 | 14-DEC-23 |
| 2510987 | 111 | 1 | 14-DEC-23 |
| 1663890 | 111 | 1 | 0 |
| 9033175 | 111 | 1 | 0 |
The result should look similar to this:
| account no | end date |
| 19908543 | 14-DEC-23 |
| 2510987 | 14-DEC-23 |
Query should exclude accounts with duplicate end dates such as 14188971 which have 2 entries, one of which has end date zero.
select
account_no,
condition
from
( select
at.account_no,
case when count( case when d.discount_no = '111'
and d.status = 1 then 1 end) = 1
then 'One active Discount' end as condition
from
discounts d
right join account_t at
on at.id = d.account_no
where
at.account_no in ('14188971','16743289', '19908543', '2510987','1663890','9033175')
and pt.purchase_end_t <> 0
group by
at.account_no )
where
condition = 'One active Discount'
Expecting query to return just accounts with end dates not equal to zero excluding duplicates which have may have end dates not equal to zero.
Upvotes: 0
Views: 85
Reputation: 11274
If all you need is the account number and end date, you can simply use GROUP BY with HAVING:
select account_no,
MAX(end_date) end_date
from table
GROUP BY account_no
HAVING COUNT(*) = 1
AND MAX(end_date) IS NOT NULL -- or != 0, or whatever...
If you need other columns, however, you can use windowing functions:
select *
from (
select col1,col2,col3,
COUNT(*) OVER (PARTITION BY account_no) cnt,
MAX(end_date) OVER (PARTITION BY account_no) end_date
from table
) where cnt = 1 and end_date IS NOT NULL
Upvotes: 1
Reputation: 17
you can easily get your result by following query:
select accounts.* from accounts inner join (select account_no, count(end_date) as end_date from discounts where status = 1 and end_date != 0 group by account_no) as dis ON dis.account_no = accounts.id
Upvotes: 0