2017-04-19 57 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