I have a table in my Oracle SQL database as follows:
DATE_A | DATE_B |
---|---|
07-2025 | 07-2025 |
05-2025 | 05-2025 |
03-2025 | 03-2025 |
01-2025 | 02-2025 |
01-2025 | 01-2025 |
01-2025 | 01-2025 |
01-2025 | 03-2025 |
04-2025 | 03-2025 |
I'd like to count the number of times that a date shows up in a group, to get a result as follows:
DATE | COUNT_A | COUNT_B |
---|---|---|
07-2025 | 1 | 1 |
05-2025 | 1 | 1 |
04-2025 | 1 | 0 |
03-2025 | 1 | 3 |
02-2025 | 0 | 1 |
01-2025 | 4 | 2 |
How might I accomplish this as efficiently as possible?
You can unpivot
then pivot
:
create table date_table (
date_a date, date_b DATE
);
insert into date_table (date_a, date_b) values (to_date('07-2025', 'MM-YYYY'), to_date('07-2025', 'MM-YYYY'));
insert into date_table (date_a, date_b) values (to_date('05-2025', 'MM-YYYY'), to_date('05-2025', 'MM-YYYY'));
insert into date_table (date_a, date_b) values (to_date('03-2025', 'MM-YYYY'), to_date('03-2025', 'MM-YYYY'));
insert into date_table (date_a, date_b) values (to_date('01-2025', 'MM-YYYY'), to_date('02-2025', 'MM-YYYY'));
insert into date_table (date_a, date_b) values (to_date('01-2025', 'MM-YYYY'), to_date('01-2025', 'MM-YYYY'));
insert into date_table (date_a, date_b) values (to_date('01-2025', 'MM-YYYY'), to_date('01-2025', 'MM-YYYY'));
insert into date_table (date_a, date_b) values (to_date('01-2025', 'MM-YYYY'), to_date('03-2025', 'MM-YYYY'));
insert into date_table (date_a, date_b) values (to_date('04-2025', 'MM-YYYY'), to_date('03-2025', 'MM-YYYY'));
select * from date_table
unpivot (
dt for col in ( date_a, date_b )
)
pivot (
count(*) for col in (
'DATE_A' date_a,
'DATE_B' date_b
)
)
order by dt desc;
DT DATE_A DATE_B
-------------------- ---------- ----------
01-JUL-2025 00:00:00 1 1
01-MAY-2025 00:00:00 1 1
01-APR-2025 00:00:00 1 0
01-MAR-2025 00:00:00 1 3
01-FEB-2025 00:00:00 0 1
01-JAN-2025 00:00:00 4 2