当前位置: 首页 > 面试题库 >

带有多个列的oracle汇总功能

衡子安
2023-03-14
问题内容

我有一个简单的查询:

WITH data(val1, val2, val3) AS
     ( SELECT 'a' ,'a-details' ,'1' FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot
from data
group by rollup(val1, val2);

我得到这样的输出:

VAL1                             VAL2                                    TOT
-------------------------------- -------------------------------- ----------
a                                a-details                                 1 
a                                                                          1 
b                                b-details                                 2 
b                                                                          2 
c                                c-details                                 3 
c                                                                          3 
Total Result                                                               6

但我需要这样的输出:

VAL1                             VAL2                                    TOT
-------------------------------- -------------------------------- ----------
a                                a-details                                 1 
b                                b-details                                 2 
c                                c-details                                 3 
Total Result                                                               6

提前致谢。


问题答案:

我发现使用GROUPING SET子句指定所需的确切集合要容易得多:

WITH data(val1, val2, val3) AS
     ( SELECT 'a' ,'a-details' ,'1' FROM DUAL
     UNION ALL
     SELECT 'b' ,'b-details' ,'2' FROM DUAL
     UNION ALL
     SELECT 'c' ,'c-details' ,'3' FROM DUAL
     )
SELECT NVL(val1,'Total Result'),
     val2,
     SUM(val3) tot
from data
group by grouping sets ((val1, val2),());

我怀疑它会更有效,因为它直接指定要计算的级别。

http://sqlfiddle.com/#!4/8301d/3

CUBE和ROLLUP对于自动生成大量聚合级别(例如,维度层次结构中的每个级别)非常方便,如果您想从生成的大型CUBE中消除一小部分级别的子集,则可能会使用GROUPING
ID设置,但是GROUPING SET是专门用于指定特定聚合级别的。



 类似资料:
  • 问题内容: 这段代码可以正常工作,但是我又长又令人毛骨悚然。 如您所见,它由3个重复部分组成,用于检索: 玩家名称和他们玩过的游戏数量 玩家名称和他们赢得的游戏数量 玩家姓名和输掉的游戏数量 并且每个还包括2个部分: 玩家名称和以玩家_1身份参加的游戏数量 玩家名称以及他们作为玩家_2参加的游戏数量 如何简化呢? 结果看起来像这样: 问题答案: Postgres 9.4* 或更高版本中的 聚合子句

  • 问题内容: 在MySQL中,我有两个表: 和 我需要对表(等式7)和表(等式3)中的列求和,并将结果作为总数量。 当我做 我得到了笛卡尔积(20),但是我需要的正确答案是10。如何更改此查询以获得正确的结果? 问题答案:

  • 问题内容: 我的桌子上有40多个列,我还需要添加一些其他字段,例如当前的城市,家乡,学校,工作,大学,拼贴画。 对于作为共同朋友(与其他用户朋友一起加入朋友表以查看共同朋友)并且未被阻止并且还尚未与该用户成为朋友的许多匹配用户,将提取这些用户数据。 上面的请求有点复杂,所以我认为将额外的数据放在同一用户表中以进行快速访问是个好主意,而不是向该表中添加更多的联接,这将使查询速度变慢。但是我想得到你的

  • 本文向大家介绍AngularJS 最常用的功能汇总,包括了AngularJS 最常用的功能汇总的使用技巧和注意事项,需要的朋友参考一下 AngularJS通过为开发者呈现一个更高层次的抽象来简化应用的开发。如同其他的抽象技术一样,这也会损失一部分灵活性。换句话说,并不是所有的应用都适合用AngularJS来做。AngularJS主要考虑的是构建CRUD应用。幸运的是,至少90%的WEB应用都是CR

  • 问题内容: 我知道,如果我在此答案中使用语法,则可以使用一条语句插入多行。 但是,我要插入的值之一取自一个序列,即 如果尝试运行它,则会收到ORA-02287错误。有什么办法解决这个问题,还是我应该只使用很多INSERT语句? 编辑: 如果我必须为序列以外的所有其他列指定列名,那么我会失去原来的简洁性,所以这是不值得的。在这种情况下,我将只使用多个INSERT语句。 问题答案: 这有效:

  • 问题内容: 我想要一个有两列的表。一栏用于记录的创建时间,另一栏用于记录的修改时间。我希望这些值由数据库处理。我不想让我的应用程序层考虑一下。 我知道,如果您有一个带有或的列,那么您将无法拥有另一个列。您可以使用,但没有办法在触发器之外默认它,据我所知。 我发现您可以具有多个列,方法是将每个列不带或保留,并在创建记录时插入,以使每个列具有当前时间戳。从这一点开始,第一列将自动更新。 这个效果非常好