1

ロールアップ関数なしで単純なクエリを書き直す必要があります。私たちを手伝ってくれますか?

これは元のクエリです。

  SELECT e.department_id, 
         e.job_id, 
         SUM(e.salary)
    FROM EMPLOYEES e
GROUP BY ROLLUP(e.department_id, e.job_id);

UNIONステートメントを使って書き直すことは可能だと思いますね。

4

3 に答える 3

2

UNION は必要ありません。GROUPING SETS を使用できます。これにより、同じ結果と同じ説明プランが生成されます。

  SELECT e.department_id, 
         e.job_id, 
         SUM(e.salary)
    FROM EMPLOYEES e
GROUP BY GROUPING SETS( (e.department_id, e.job_id), (e.department_id), () )
于 2011-02-23T02:06:48.510 に答える
1

以下は、ロールアップと同じ結果を返すはずですが、パフォーマンスが低下し、「レベル」の制御が低下します。

select e.department_id
      ,e.job_id
      ,SUM(e.salary)
  from EMPLOYEES e
 group 
    by e.department_id
      ,e.job_id
union all
select e.department_id
      ,null
      ,SUM(e.salary)
  from EMPLOYEES e
 group 
    by e.department_id
union all
select null
      ,null
      ,SUM(e.salary)
  from EMPLOYEES e;
于 2011-02-22T19:30:21.637 に答える
1

CTE を使用して処理できます (サンプル データを取得するためだけに接続を介して EMPLOYEE テーブルを作成したことに注意してください)。これを行うにはおそらくもっと良い方法がありますが、これは方法です!

WITH EMPLOYEES AS(
    SELECT   MOD(LEVEL,5)  DEPARTMENT_ID 
           , LEVEL JOB_ID 
           , 1000*LEVEL SALARY
      FROM DUAL      
     CONNECT BY LEVEL < 10
)
, SUMMEDDATA AS(
  SELECT e.department_id, 
         e.job_id, 
         SUM(e.salary) SUMMED_SALARY
    FROM EMPLOYEES e
GROUP BY e.department_id, e.job_id
)
, SUMMEDJOB_ID AS(
  SELECT e.department_id, 
         SUM(e.salary) SUMMED_SALARY
    FROM EMPLOYEES e
GROUP BY e.department_id
)
, SUMMEDTOTAL AS(
  SELECT  
         SUM(e.salary) SUMMED_SALARY
    FROM EMPLOYEES e
)
SELECT DEPARTMENT_ID ,
       JOB_ID ,
       SUMMED_SALARY
  FROM SUMMEDDATA
UNION ALL
SELECT DEPARTMENT_ID ,
       NULL ,
       SUMMED_SALARY
  FROM SUMMEDJOB_ID
UNION ALL
SELECT NULL ,
       NULL ,
       SUMMED_SALARY
  FROM SUMMEDTOTAL
ORDER BY 1 NULLS LAST, 2 NULLS LAST ;

DEPARTMENT_ID          JOB_ID                 SUMMED_SALARY          
---------------------- ---------------------- ---------------------- 
0                      5                      5000                   
0                                             5000                   
1                      1                      1000                   
1                      6                      6000                   
1                                             7000                   
2                      2                      2000                   
2                      7                      7000                   
2                                             9000                   
3                      3                      3000                   
3                      8                      8000                   
3                                             11000                  
4                      4                      4000                   
4                      9                      9000                   
4                                             13000   
                                              45000    
于 2011-02-22T19:29:39.203 に答える