sqloracle-database

Get Counts, then Group By Values


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?


Solution

  • 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