Try something like this:SELECT col1, col2, col3, SUM(col4) AS total FROM (SELECT 1, 'a', 'x', 10 UNION ALL SELECT 1, 'a', 'x', 20 UNION ALL SELECT 1, 'a', 'y', 30 UNION ALL SELECT 1, 'b', 'x', 100 UNION ALL SELECT 2, 'a', 'x', 1000) AS S(col1, col2, col3, col4) GROUP BY col1, col2, col3 WITH ROLLUPHAVING GROUPING(col1) = GROUPING(col2) AND GROUPING(col2) = GROUPING(col3);
By the way in 2008 and beyond this becomes much easier using GROUPING SETS like this:SELECT col1, col2, col3, SUM(col4) AS total FROM (SELECT 1, 'a', 'x', 10 UNION ALL SELECT 1, 'a', 'x', 20 UNION ALL SELECT 1, 'a', 'y', 30 UNION ALL SELECT 1, 'b', 'x', 100 UNION ALL SELECT 2, 'a', 'x', 1000) AS S(col1, col2, col3, col4) GROUP BY GROUPING SETS((col1, col2, col3), ())