1

我正在尝试使用 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']

非常感谢帮助,谢谢!

4

2 回答 2

0

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

sequence...或者如果在或列中可能出现 NULL 值length,请使用: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
于 2013-07-25T23:30:07.190 回答
0

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

  • 您使用表别名a,但未定义。
  • 您使用表别名b,但未定义。
  • 您的sum()inselect子句中包含未聚合的列,但没有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是在外层进行。而且,我给了子查询一个别名。这不是严格要求的,但通常是一个好主意。

于 2013-07-25T23:41:55.677 回答