Search code examples
oracle-databaseoracle11ggroup-byrollup

Getting desired output from Rollup


Can you please help me in getting the below output

data script

        create table temp(id number,first_name varchar2(10),last_name varchar2(10),order_id varchar2(2));
            insert into temp values(1,'Ram1','Shayam1','O1');
            insert into temp values(1,'Ram1','Shayam1','O2');
            insert into temp values(2,'Ram2','Shayam2','O1');
            insert into temp values(2,'Ram2','Shayam2','O2');
            insert into temp values(3,'Ram3','Shayam3','O1');
            insert into temp values(4,'Ram4','Shayam4','O1');
            insert into temp values(4,'Ram4','Shayam4','O2');
            insert into temp values(4,'Ram4','Shayam4','O3');
            insert into temp values(5,'Ram5','Shayam5','O1');
            insert into temp values(5,'Ram5','Shayam5','O2');
            insert into temp values(5,'Ram5','Shayam5','O3');
            insert into temp values(6,'Ram6','Shayam6','O1');
            insert into temp values(7,'Ram7','Shayam7','O1');

output

id   first_name   last_name  order_id  count
--------------------------------------------
1      Ram1        Shayam1    O1       1
1      Ram1        Shayam1    O2       1
1                                      2  --total number of id,grp by id
2      Ram2        Shayam2    O1       1
2      Ram2        Shayam2    O2       1
2                                      2
3      Ram3        Shayam3    O1       1
3                                      1
4      Ram4        Shayam4    O1       1
4      Ram4        Shayam4    O2       1
4      Ram4        Shayam4    O3       1
4                                      3
5      Ram5        Shayam5    O1       1
5      Ram5        Shayam5    O2       1
5      Ram5        Shayam5    O3       1
5      Ram5        Shayam5    O4       1
5                                      4
6      Ram6        Shayam6    O1       1
6                                      1      
7      Ram7        Shayam7    O1       1
7                                      1
                                       7  --total distinct id

I have tried using rollup ,but I am not able to achieve the last total distinct id with rollup

SQLFIDDLE


Solution

  • According to your desired output it should be like this:

    SELECT id,
      first_name,
      last_name,
      order_id,
      CASE
        WHEN grouping(id) = 1
        THEN COUNT(DISTINCT id)
        ELSE COUNT(*)
      END res
    FROM temp
    GROUP BY grouping sets ((id ,first_name ,last_name ,order_id),(id),());