2017-04-19 78 views
0

早上好,我是一名初級數據庫程序員。分組技術SUM數據庫

我想寫這段代碼的最短路。

我想表明我AFTE這樣

fyear  money 
<2012  4 
2012  5 
2013  5 
2014  5 
total  19 

執行我有這樣

SELECT fyear,SUM(money) 
FROM (

      SELECT  CASE 
         WHEN fyear < 2012 THEN ' <2012' 
         WHEN fyear = 2012 THEN '2012' 
         WHEN fyear = 2013 THEN '2013' 
         WHEN fyear = 2014 THEN '2014' 
         END fyear, money 

       FROM( 
        SELECT fyear, money 
        FROM table1 
        UNION ALL 
        SELECT fyear, money 
        FROM table2 
        ) 
)GROUP BY fyear 

此代碼的代碼上面

fyear  money 
<2012  4 
2012  5 
2013  5 
2014  5 

這是缺少總。我不確定如何添加「總計」,在代碼中添加「總計」的最佳方式是什麼?

謝謝你這麼多

回答

2

您可能需要一個ROLLUP

select NVL(fyear, 'total') fyear, money 
from (
     SELECT fyear, SUM(money) money 
     FROM (SELECT CASE 
         WHEN fyear < 2012 THEN '<2012' 
         WHEN fyear = 2012 THEN '2012' 
         WHEN fyear = 2013 THEN '2013' 
         WHEN fyear = 2014 THEN '2014' 
        END fyear, money 
       FROM (SELECT fyear, money FROM table1 
        UNION ALL 
        SELECT fyear, money FROM table2 
        ) 
      ) 
     GROUP BY rollup(fyear) 
    ) 

這給:

FYEAR  MONEY 
------ ---------- 
<2012   4 
2012   5 
2013   5 
2014   5 
total   19 

順便說一句,根據您的情況,您CASE大概可以簡化:

CASE 
    WHEN fyear < 2012 THEN '<2012' 
    ELSE to_char(fyear) 
END 
1

您可以使用聯合來添加如下的總行;

with line_tots AS 
(SELECT fyear, SUM (curr_qty) as curr_qty 
FROM (SELECT CASE 
        WHEN fyear < 2012 THEN ' <2012' 
        WHEN fyear = 2012 THEN '2012' 
        WHEN fyear = 2013 THEN '2013' 
        WHEN fyear = 2014 THEN '2014' 
       END 
        fyear, 
       curr_qty 
     FROM table_1) 
GROUP BY fyear 
ORDER BY fyear) 
SELECT * 
    FROM (
     SELECT fyear, curr_qty 
     FROM line_tots 
     UNION ALL 
     SELECT 'total', SUM(curr_qty) 
     FROM line_tots 
     ) 
ORDER BY fyear 

(我刪除兩個表中作爲其必要的解決方案中選擇你的子查詢)

如果您在使用SQL * Plus那麼另一種方法是使用不要求改變一個計算報告列到您的查詢。

SQL> compute sum label total of curr_qty on report 
SQL> break on curr_qty on report 
SQL> l 
    1 SELECT fyear, SUM (curr_qty) as curr_qty 
    2 FROM (SELECT CASE 
    3     WHEN fyear < 2012 THEN ' <2012' 
    4     WHEN fyear = 2012 THEN '2012' 
    5     WHEN fyear = 2013 THEN '2013' 
    6     WHEN fyear = 2014 THEN '2014' 
    7     END 
    8     fyear, 
    9     curr_qty 
10   FROM table_1) 
11 GROUP BY fyear 
12* ORDER BY fyear 
SQL>/

FYEAR CURR_QTY 
------ ---------- 
<2012   13 
2012   10 
2013   12 
2014   9 
     ---------- 
total   44