SQL:3个表,从2个表中选择列,并在一列上求和

SQL:3个表,从2个表中选择列,并在一列上求和,sql,Sql,Tbl1 fld1 fld12 fld3 fld4 Tbl2 fld5 fld6 fld7 Tbl3 fld8 fld9 fld10 fld11 fld12 fld13 查询: select fld8, fld11, fld12, sum(fld3), fld4 from tbl1, tbl2, tbl3 where fld1=fld5 and fld2=fld6 and fld7=fld8 查询未运行。我使用了联接,但sum不起作用。使用fld3进行查询将起作用,但不能使用sum(f

Tbl1

fld1 fld12 fld3 fld4
Tbl2

fld5 fld6 fld7 
Tbl3

fld8 fld9 fld10 fld11 fld12 fld13
查询:

select fld8, fld11, fld12, sum(fld3), fld4
from tbl1, tbl2, tbl3
where fld1=fld5 and fld2=fld6 and fld7=fld8

查询未运行。我使用了联接,但sum不起作用。使用
fld3
进行查询将起作用,但不能使用
sum(fld3)
。请帮助。

您必须有
分组依据

select fld8, fld11, fld12, sum(fld3), fld4 
from tbl1, tbl2, tbl3 where fld1=fld5 and fld2=fld6 and fld7=fld8 
group by fld8, fld11, fld12, fld4

否则,
sum
函数将如何工作?

某些数据库引擎要求您在使用聚合(sum、count avg等)时指定一个组

或者用另一种方式写

select fld8, fld11, fld12, sum(coalesce(fld3,0)), fld4
from tbl1 
INNER JOIN tbl2 on fld1=fld5 and fld2=fld6
INNER JOIN tbl3 on  fld7=fld8
GROUP BY fld8, fld11, fld12, fld4
现在,这两个表都假设在所有3个表中都有记录。如果情况并非如此,则可能需要使用外部联接,并根据引擎的不同在sum字段或nvl上合并

所以也许

SELECT fld8, fld11, fld12, sum(coalesce(fld3,0)), fld4
FROM  tbl1 
LEFT JOIN tbl2 on fld1=fld5 and fld2=fld6
LEFT JOIN tbl3 on  fld7=fld8
GROUP BY fld8, fld11, fld12, fld4

你期望的结果是什么ANSI-92 SQL标准(20年前!)已经不再使用老式的逗号分隔的表格列表样式。根据所需的结果,它们不必使用
分组方式,这取决于它们可能需要的
sum(fld3)OVER()
。取决于他们希望什么
sum(fld3)
将返回。谢谢,我没有使用Group by,而是使用Order by。我已经使用左连接构建了查询框架,工作起来很有魅力。
SELECT fld8, fld11, fld12, sum(coalesce(fld3,0)), fld4
FROM  tbl1 
LEFT JOIN tbl2 on fld1=fld5 and fld2=fld6
LEFT JOIN tbl3 on  fld7=fld8
GROUP BY fld8, fld11, fld12, fld4