I learn about CUBE and ROLLUP function today and I found it really usefull for generating reports. Let me give you one example where we can use ROLLUP and CUBE. Lets say you are developing the E-Commerce application and administrator wants the report which shows products purchased by all user group by product and buyer. You will say that’s really easy and can write the query as shown below,
1: SELECT CustomerName,CustomerName,SUM(Quantity*PricePerItem)
2: FROM Orders GROUP BY CustomerName,CustomerName
Fig – (1) Group By clause.
Which will returns the result as shown below,
Fig – (2) Result of GROUP BY clause
However what if you want result as display below,
Fig – (3) Desire result
Here ROLLUP and CUBE comes into the picture and help us. The above result is generated using ROLLUP. ROLLUP adds new row for each column used in GROUP BY clause. First have a look at the query and then we will discuss more,
1: SELECT
2: CASE
3: WHEN GROUPING(customername) = 1 THEN 'All Customer'
4: ELSE customername END CustomerName,
5: CASE WHEN GROUPING(itemname) = 1 THEN 'All Items'
6: ELSE itemname END ItemName,
7: SUM(Quantity*PricePerCase)
8: FROM orders GROUP BY customername,itemname
9: WITH ROLLUP
Fig – (4) Query for output shown in fig – 3
As you can see in query we have used ROLLUP after GROUP BY clause. Here ROLLUP has added new row at line 3,5 and 6 in fig 3. If you have used only one columns in GROUP BY clause then only row will have been added. The new clause in query is GROUPING. GROUPING clause add new column in result set. The value in new column can either be 0 or 1. If the new row is added by the ROLLUP or CUBE then the value of GROUPING column is 1 else 0.
In fig – 3 we have total price by user name, wow lets assume you want the total price by item name also. Here you have to use CUBE as shown below,
1: SELECT
2: CASE
3: WHEN GROUPING(customername) = 1 THEN 'All Customer'
4: ELSE customername END CustomerName,
5: CASE WHEN GROUPING(itemname) = 1 THEN 'All Items'
6: ELSE itemname END ItemName,
7: SUM(Quantity*PricePerCase)
8: FROM orders GROUP BY customername,itemname
9: WITH CUBE
Fig – (5) CUBE clause
Fig – (6) Result of CUBE
Happy Programming !!!!
very good explanation
There is error on the first query. then all the information is good
Thanx a lot…it’s really a nice example…
Hey, I came to know about a entirely a new concept in sql server and also the explantion is good.
gr8
good explanation – From Malaysia
Very understandable explanation, really very useful…
Thanks for sharing, nice job!
One question for you, if I want to add a column, which is the percentage based on each customername, what should I do? I mean like,
Jacob, item1 is $312, how can I get the percentage of the total $792.5.
Thanks a lot!!
V good………
nice job guys…..
It helps a lots of people………
very helpful illustration!!
Short & understandable concept…thnks to whole team.
Really nice example for studying.
hey,
very good explanation..explained in a very simple way.it helps me a lot
thx for the whole team
here there is some problem..
change Itemname insted of CustomerName..
all other is good
thanks
1: SELECT CustomerName,CustomerName,SUM(Quantity*PricePerItem)
2: FROM Orders GROUP BY CustomerName,CustomerName
Hi,
I tried to use rollup function but got this error on sql 2005
Invalid Query: CUBE and ROLLUP cannot compute distinct aggregates.
pch
It was really a good example . I was more interested in CUBE.
it was gr8.
G8 and Five Star Answer
hi,
you r really doing a gr8 job. this example helps me a lot.
thanks
thanks for sharing this article………..really a good example…..
given a star schema with four dimensions,how many select-sum-group by statements will be replaced by a select-sum-group by cube statement?
Reply to my email ASAP
Very Nice Information