使用子查询对多个列求和

时间:2013-07-25 23:26:37

标签: sql oracle tsql subquery

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

非常感谢,谢谢!

2 个答案:

答案 0 :(得分:0)

SUM()汇总行数。而是将其替换为sequence + length

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

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

BTW:您不应该引用子查询外部子查询中使用的内部别名。一些数据库服务器允许它(我现在没有方便的访问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

答案 1 :(得分:0)

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

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