分组集:在其他特定列中显示小计?

时间:2011-10-27 15:08:31

标签: sql sql-server sql-server-2005

可以在其他特定列中显示小计吗?

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

其实我得到了这个结果:

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

我怎么能得到它? :

DEPTNO      EMPNO   SUM(SAL)  Subtotals

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

注意:我不能使用ROLLUP或CUBE。

由于

3 个答案:

答案 0 :(得分:1)

我同意Jamie您可能希望在不同的层中直观地处理小计,但您可能想要尝试的是使用列上的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 :(得分:0)

在SqlServer(2005+)中,您可以使用ROLLUP命令获取该类型的数据

SQL 2005

SELECT DeptNo, EmpNo, SUM(SAL),
   FROM myTable
   GROUP BY DeptNo, EmpNo WITH ROLLUP

或2008年

SELECT DeptNo, EmpNo, SUM(SAL),
   FROM myTable
   GROUP BY ROLLUP(DeptNo, EmpNo)

编辑:

理想情况下,这将使用ROLLUP,然后处理UI中的数据解析,或在业务逻辑层(甚至UI)中操作它以根据需要显示数据。

但是,如果必须在SQL Server中执行此操作,则可以在函数或存储过程中构建TEMP表,以便为您提供所需的数据,但这需要对数据进行多次传递。

答案 2 :(得分:0)

使用外部选择重新格式化列:

select deptno, empno, 
    CASE WHEN empno is null THEN "" ELSE "sum_salary" END, 
    CASE WHEN empno is null THEN "sum_salary" ELSE "" END
from ( SELECT deptno,empno,SUM(sal) as sum_salary  FROM emp_test 3   
       GROUP BY GROUPING SETS  ((DeptNo,Empno),(DeptNo)) );