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

1 oracle sum

我被困在如何对一列求和的方式上,让我们说表的第一列(来自另一个查询的结果)而不知道列名和列位置 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...
)
Run Code Online (Sandbox Code Playgroud)

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

select employName, sum(what?), employID from tableX
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*y M 7

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

SELECT
  ...
FROM
  (
    SELECT
      expression
    FROM
      ...
  )
Run Code Online (Sandbox Code Playgroud)

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

SELECT
  ...
FROM
  (
    SELECT
      expression AS SomeAlias
    FROM
      ...
  )
Run Code Online (Sandbox Code Playgroud)

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

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

  (
    SELECT
      COUNT(*)
    FROM
      ...
  )
Run Code Online (Sandbox Code Playgroud)

那么你必须写

SELECT
  "COUNT(*)"
FROM
  (
    SELECT
      COUNT(*)
    FROM
      ...
  )
Run Code Online (Sandbox Code Playgroud)

而不是

SELECT
  COUNT(*)
FROM
  (
    SELECT
      COUNT(*)
    FROM
      ...
  )
Run Code Online (Sandbox Code Playgroud)

如果要引用派生表的列;否则,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...
)
Run Code Online (Sandbox Code Playgroud)

也就是说,为什么要避免显式分配别名?通常,它不是关于你怎么办的事情,而是对事业的意思做。此外,如果AS name由于某种原因在表达式之后立即使用是不可接受的,您还有其他选项可以分配列别名,如ypercube?? .


ype*_*eᵀᴹ 5

在标准 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 ;
Run Code Online (Sandbox Code Playgroud)

您可以使用类似的结构,即 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 ;
Run Code Online (Sandbox Code Playgroud)