我正在尝试使用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']
非常感谢,谢谢!
答案 0 :(得分:0)
SUM()
汇总行数。而是将其替换为sequence + length
。
...或者如果sequence
或length
列中可能出现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
位于外层。而且,我给子查询一个别名。这不是严格要求,但通常是一个好主意。