【问题标题】:Sum multiple columns using a subquery使用子查询对多列求和
【发布时间】:2013-07-25 23:26:37
【问题描述】:

我正在尝试使用 Oracle 的数据库。 我正在尝试对同一行中的两列求和并即时输出总数。 但是,我似乎无法让它工作。这是我到目前为止的代码。

SELECT a.name , SUM(b.sequence + b.length) as total 
FROM (
  SELECT a.name, a.sequence, b.length
  FROM tbl1 a, tbl2 b
  WHERE b.sequence = a.sequence 
  AND a.loc <> -1 
  AND a.id='10201'
  ORDER BY a.location
)

内部查询有效,但我似乎无法使新查询和子查询一起工作。

这是我正在使用的示例表:

...[name][sequence][length]...
...['aa']['100000']['2000']...
            ...
...['za']['200000']['3001']...

这是我想要的输出:

[name][  total ]
['aa']['102000']
            ...
['za']['203001']

非常感谢您的帮助,谢谢!

【问题讨论】:

    标签: sql oracle tsql subquery


    【解决方案1】:

    SUM() 对行数求和。而是将其替换为sequence + length

    ...或者如果sequencelength 列中可能出现NULL 值,请使用:COALESCE(sequence, 0) + COALESCE(length, 0)

    或者,如果您确实打算生成一个运行总计(即汇总每个用户的所有总计和长度的总和),请在子查询结束后添加 GROUP BY a.name

    顺便说一句:您不应该从子查询外部引用子查询内部使用的内部别名。一些数据库服务器允许它(我现在不能方便地访问 Oracle 服务器,所以我可以测试它),但这并不是一个很好的做法。

    我认为你所追求的是这样的:

    SELECT a.name, 
           SUM(B.sequence + B.length)    AS total
     FROM Tbl1 A
          INNER JOIN Tbl2 B
             ON B.sequence = A.sequence
    WHERE A.loc <> -1
      AND A.id = 10201
          GROUP BY a.name
          ORDER BY A.location
    

    【讨论】:

    • 嗨,Curt,我确实需要一个运行总计。我尝试了 GROUP BY a.name,但它说 a.name 是无效标识符。即使没有它,序列+长度也会失败。
    • 那是因为您从子查询中引用了一个内部别名。我添加了一个我认为对我的答案有用的查询...
    • 谢谢。是的,这正是我一直在寻找的。不需要子查询。谢谢柯特!
    【解决方案2】:

    您的子查询查询失败有几个原因:

    • 您使用了表别名a,但未定义。
    • 您使用了表别名b,但未定义。
    • select 子句中有未聚合列的 sum(),但没有 group by

    此外,您在子查询中有一个order by,它在语法上是允许的,但被忽略了。

    这是编写不带子查询的查询的更好方法:

    SELECT t1.name, (t1.sequence + t2.length) as total
    FROM tbl1 t1 join
         tbl2 t2
         on t1.sequence = t2.sequence 
    where t1.loc <> -1 AND t1.id = '10201'
    ORDER BY t1.location;
    

    注意使用正确的join 语法、使用有意义的别名以及此级别的简单计算。

    这是一个带有子查询的版本:

    select name, (sequence + length) as total
    from (SELECT t1.name, t1.sequence, t2.length
          FROM tbl1 t1 join
               tbl2 t2
               on t1.sequence = t2.sequence 
          where t1.loc <> -1 AND t1.id = '10201'
         ) t
    ORDER BY location;
    

    请注意,order by 位于外层。而且,我给了子查询一个别名。这不是严格要求,但通常是个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2021-11-13
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多