ENH: Group By Grouping set /Cube/ Rollup
#### Problem description
Basically these are performance tools in SQL to get analysis in multiple dimensions and they are missing in Pandas out of the box. Some of these can be achieved by a pivot table and melt/stack functions but being tools for analysis these functions should be a must and it also decreases the number of lines of code.

Group by Grouping set will help to rewrite the query with multiple groups by clauses combined with union statements into a single query. Cube is shorthand notation of grouping sets if the user chooses all the combinations of the fields listed in the cube clause 

```SQL Code
SELECT
    column1,
    column2,
    aggregate_function (column3)
FROM
    table_name
GROUP BY
    GROUPING SETS (
        (column1, column2),
        (column1),
        (column2),
        ()
);

Select   column1,
            column2,
            column3,
            column4,
            aggregate_function (column5)
from table
group by column1, column2, cube (column3,column4)```

Current way
```pseudo code
  a= <pandas dataframe>
  a1 = a.groupby([column1]).sum(column5)
  a2  = a.groupby([column1,column2]).sum(column5)
   ...
  an = a.groupby([column1,...,columnn]).sum(column5)
 result= union(a1,a2,......an)
```
Expected way 
```pseudo code
  a= <pandas dataframe>
  
  gropby_cube1 = a.gropby([column1,column2]).cube([column3,.....,columnn]).sum(column5)
   gropby_cube2 = a.gropby.cube([column1,column2,.....,columnn]).sum(column5)

   gropby_sets1 = a.gropby.sets( {column1,column2} ,{column1,column2,column3} ,{}).sum(column5)
   gropby_sets2 = a.gropby([column1,column2).sets({column1,column2,column3} ,{} ).sum(column5)

   gropby_rollup1 = a.gropby.rollup({column1,column2,column3}).sum(column5)
   gropby_rollup2 = a.gropby([column1,column2).rollup({column3} ).sum(column5)
```

