2011-10-27 24 views
1

別々の行で小計を計算する必要がありますが、ROLLUPまたはCUBEは使用できません(許可されていないため)。私はSQLサーバー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