AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 218315
Accepted
user108219
user108219
Asked: 2018-09-23 02:54:09 +0800 CST2018-09-23 02:54:09 +0800 CST 2018-09-23 02:54:09 +0800 CST

如何在没有名称的情况下对列进行求和?

  • 772

我陷入了一种方式,即如何对列进行求和,比如说表的第一列(来自另一个查询的结果),而不知道列名和列位置 id 之类的东西。

是这样的

select sum(what?), employID from
    ( select count(*), employID from  table1...
           union all
      select count(*), employID from  table2...
           union all
      select count(*), employID from  table3...
)

或者,如果它在单个查询中(使用 sum() 的单个简单选择查询),例如:

select employName, sum(what?), employID from tableX

如何告诉 SUM() 函数根据表中的列位置索引求和SUM(2)?

注意:我不想使用列别名,是否有可能不基于列名进行 SUM?

我知道我可以使用列名或别名,但我真的想知道不使用这些的可能性,这就是我问这个问题的原因,如果没有可能的方法,我会接受“否”作为正确答案。

oracle sum
  • 4 4 个回答
  • 2359 Views

4 个回答

  • Voted
  1. Best Answer
    Andriy M
    2018-09-23T04:19:07+08:002018-09-23T04:19:07+08:00

    许多(也许是大多数)其他数据库产品不允许您使用没有明确指定别名的计算列定义派生表。换句话说,他们不会让你拥有这个

    SELECT
      ...
    FROM
      (
        SELECT
          expression
        FROM
          ...
      )
    

    相反,您必须执行以下操作:

    SELECT
      ...
    FROM
      (
        SELECT
          expression AS SomeAlias
        FROM
          ...
      )
    

    原因是,它们不会自动为表达式分配名称。相反,Oracle 会这样做,这就是为什么当您的派生表有一个没有显式别名的计算列时 Oracle 很好的原因。该列将具有默认名称。唯一的问题是,该名称将是什么。

    基本上,名称就是表达式本身,但 Oracle 在将其用作名称之前会对原始表达式应用某些转换。特别是,所有未加引号的标识符(包括函数名称)都是大写的,并且所有空格都被删除。因此,如果表达式为count(*),则列的默认名称变为COUNT(*)。如果表达式为a + 1,则默认名称为A+1。请注意,这两个示例中的特殊符号 ( (, *, ), +) 规定您将名称括在引号中以便能够将其用作参考。换句话说,如果您有这样的派生表:

      (
        SELECT
          COUNT(*)
        FROM
          ...
      )
    

    那么你必须写

    SELECT
      "COUNT(*)"
    FROM
      (
        SELECT
          COUNT(*)
        FROM
          ...
      )
    

    而不是

    SELECT
      COUNT(*)
    FROM
      (
        SELECT
          COUNT(*)
        FROM
          ...
      )
    

    如果要引用派生表的列;否则,Oracle 将不将引用解释为引用,而是将其解释为实际表达式(COUNT 函数的另一个调用,这次应用于派生表的输出)。

    因此,在您的具体示例中,您可以将派生表的第一列引用为"COUNT(*)":

    select sum("COUNT(*)"), employID from
        ( select count(*), employID from  table1...
               union all
          select count(*), employID from  table2...
               union all
          select count(*), employID from  table3...
    )
    

    也就是说,为什么要避免显式分配别名?通常这不是关于你想如何做事,而是关于事情应该如何做。此外,如果AS name由于某种原因在表达式之后立即使用是不可接受的,那么您还有其他分配列别名的选项,如ypercubeᵀᴹ 的答案中所建议的那样。

    • 7
  2. ypercubeᵀᴹ
    2018-09-23T03:43:50+08:002018-09-23T03:43:50+08:00

    在标准 SQL 中添加别名(用于派生表及其列)的另一种方法是(不幸的是,它尚未在 Oracle 中实现):

    select 
        sum(count_employees) as total_count,
        employID 
    from
        ( select count(*), employID from  table1...
               union all
          select count(*), employID from  table2...
               union all
          select count(*), employID from  table3...
        )
           t           (count_employees, employID)
        -- table_alias (column1_alias,   column2_alias)
    group by
        employID ;
    

    不过,您可以使用类似的结构,即 CTE,它适用于最新版本的 Oracle(11+):

    with   t           (count_employees, employID)
        -- table_alias (column1_alias,   column2_alias)
        as
        ( select count(*), employID from  table1...
               union all
          select count(*), employID from  table2...
               union all
          select count(*), employID from  table3...
        )
    select 
        sum(count_employees) as total_count,
        employID 
    from
        t
    group by
        employID ;
    
    • 5
  3. Kapil Bhagchandani
    2018-09-23T03:14:59+08:002018-09-23T03:14:59+08:00

    您需要通过使用别名来重写您的查询

    select sum(employees), employID from
        ( select count(*) As employees, employID from  table1...
           union all
          select count(*) As employees, employID from  table2...
           union all
          select count(*) As employees, employID from  table3...
    )
    
    • 2
  4. AMtwo
    2018-09-23T03:50:02+08:002018-09-23T03:50:02+08:00

    不,使用列别名。

    作为最佳实践,请始终使用列别名。

    • 2

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve