ROLLUP的替代品

时间:2011-10-27 08:44:14

标签: sql sql-server sql-server-2008

我需要在单独的行中计算小计,但我不能使用ROLLUP或CUBE(因为不允许)。我使用的是SQL Server 2008。 还有另一种获得关注结果的方法吗?提前谢谢!

SELECT deptno, empno, SUM (sal) 2 FROM emp_test 3 GROUP BY ROLLUP (deptno, empno);

DEPTNO      EMPNO   SUM(SAL)

    10       7782      20000
    10       7839      10000
    10                 30000
    20       7566       5950
    20       7788       6000
    20       7902       6000
    20                 17950
    30       7698      20000
    30       7699      20000
    30                 40000
                       87950

3 个答案:

答案 0 :(得分:2)

您可能想尝试使用列上的GROUPING()函数。如果它是GROUPING SETS小计的一部分,则此函数返回1;如果它是常规列,则返回0。 http://technet.microsoft.com/en-us/library/ms178544(SQL.90).aspx

我包含了我测试过的样本数据。使用select语句时删除第一个WITH emp_test AS ()

我的测试数据:

WITH emp_test AS
(
   SELECT 10 AS DEPTNO, 7782 AS EMPNO, 20000 AS sal
   UNION ALL SELECT 10, 7839, 10000
   UNION ALL SELECT 20, 7566, 5950
   UNION ALL SELECT 20, 7788, 6000
)

下面的实际查询:

SELECT deptno, empno
   , CASE
      WHEN GROUPING(empNo) = 1 THEN null
      ELSE SUM(sal)
     END as sum_salary
   , CASE
      WHEN GROUPING(empno) = 1 THEN SUM(sal)
      ELSE NULL
     END AS SubTotal
FROM emp_test
GROUP BY GROUPING SETS (DeptNo, Empno), (DeptNo)

答案 1 :(得分:1)

如果你有SQL Server 2008,你可以考虑改为Grouping sets吗?

对于你的情况,我认为会是:

SELECT deptno
,empno
,SUM(sal) as sum_salary
FROM emp_test 3 
GROUP BY GROUPING SETS
((DeptNo,Empno),())

但我只有2005年所以无法测试它!

答案 2 :(得分:0)

您宁愿使用Cursor编写一个过程来获得类似的结果。