2011-10-27 34 views
1

我需要在一個單獨的行中計算小計,但我不能使用ROLLUP或CUBE(因爲不允許)。我使用SQL Server 2008. 還有其他方法可以獲得跟蹤結果嗎?提前致謝!替代ROLLUP

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 
+0

我得到這個,但我不管理「的CUBE()和ROLLUP()分組構造中不允許當前的兼容模式,它們只允許在100模式或更高版本中使用。「 – TimeIsNear

+0

目前我無法與DBA – TimeIsNear

+0

進行通信,這意味着您沒有使用SQL Server 2008(或確實是2005)。問你的DBA爲什麼兼容模式不能>> 90 <<或更高 –

回答

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) 
0

你而寫使用光標獲得類似的結果的過程。

+0

爲什麼不,但你能給我一個例子來獲得上述結果嗎? – TimeIsNear

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所以無法測試一下吧!

+0

我已經嘗試過,但我現在沒有如何使用它,你能給我一個例子嗎? thx – TimeIsNear

+0

它不工作,結果是轉移。 – TimeIsNear

+0

嘗試使用GROUPING SETS((Deptno,Empno),(Deptno),()) - 我沒有看到你最初想要每個部門的小計! – Dibstar