Search code examples
sqloracleresponsys

Pivot in SQL: count not working as expected


I have in my Oracle Responsys Database a table that contains records with amongst other two variables:

  • status

  • location_id

I want to count the number of records grouped by status and location_id, and display it as a pivot table.

This seems to be the exact example that appears here

But when I use the following request :

select * from 
    (select status,location_id from $a$ ) 
        pivot (count(status) 
        for location_id in (0,1,2,3,4)
    ) order by status

The values that appear in the pivot table are just the column names :

output :

status    0    1    2    3    4
-1        0    1    2    3    4
1         0    1    2    3    4
2         0    1    2    3    4
3         0    1    2    3    4
4         0    1    2    3    4
5         0    1    2    3    4

I also gave a try to the following :

select * from 
     (select status,location_id , count(*) as nbreports 
       from $a$ group by status,location_id ) 
              pivot (sum(nbreports) 
              for location in (0,1,2,3,4)
    ) order by status

but it gives me the same result.

 select status,location_id , count(*) as nbreports 
 from $a$ 
 group by status,location_id

will of course give me the values I want, but displaying them as a column and not as a pivot table

How can I get the pivot table to have in each cell the number of records with the status and location in row and column?

Example data:

CUSTOMER,STATUS,LOCATION_ID
1,-1,1
2,1,1
3,2,1
4,3,0
5,4,2
6,5,3
7,3,4

The table data types :

CUSTOMER    Text Field (to 25 chars)
STATUS  Text Field (to 25 chars)
LOCATION_ID Number Field

Solution

  • Please check if my understanding for your requirement is correct, you can do vice versa for the location column

        create table test(
        status varchar2(2),
        location number
        );
    
        insert into test values('A',1);
        insert into test values('A',2);
        insert into test values('A',1);
        insert into test values('B',1);
        insert into test values('B',2);
    
        select * from test;
    
        select status,location,count(*)
        from test 
        group by status,location;
    
        select * from (
        select status,location
        from test 
        ) pivot(count(*) for (status) in ('A' as STATUS_A,'B' as STATUS_B))
    

    enter image description here