Sql 按返回分组求和错误
有这两张桌子吗 系Sql 按返回分组求和错误,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,有这两张桌子吗 系 //DEPARTMENT D# DNAME ------------------- 1 RESEARCH 2 IT 3 SCIENCE 计划 //PROJECT P# D# BUDGET ------------------------- 1001 1 22500 1002 1 22500 1003 3
//DEPARTMENT
D# DNAME
-------------------
1 RESEARCH
2 IT
3 SCIENCE
计划
//PROJECT
P# D# BUDGET
-------------------------
1001 1 22500
1002 1 22500
1003 3 50000
当我执行这个命令时
SELECT d.D#,DNAME,sum(budget) as "TOTAL BUDGETS"
FROM DEPARTMENT d,PROJECT p
WHERE d.D# = p.D#
GROUP BY d.D#;
我想结果会很好
D# DNAME TOTAL BUDGETS
------------------------------
1 RESEARCH 45000
2 IT 0
3 SCIENCE 50000
但是为什么我会犯这个错误呢
//Oracle: NOT A GROUP BY EXPRESSION ERROR
选择列表中的所有列名必须出现在GROUP BY子句中,除非名称仅用于聚合函数。 将查询更改为:
SELECT d.D#,DNAME,sum(budget) as "TOTAL BUDGETS"
FROM DEPARTMENT d,PROJECT p
WHERE d.D# = p.D#
GROUP BY d.D#, DNAME;
最新评论:
SELECT d.D#, d.DNAME, NVL(SUM(p.budget), 0) as "TOTAL BUDGETS"
FROM DEPARTMENT d LEFT OUTER JOIN PROJECT p ON d.D#=p.D#
GROUP BY d.D#, d.DNAME;
您应该在
分组依据
部分包含该字段,或者使用聚合函数(MAX
或MIN
在这种情况下是可以的)您忘记了在分组依据语句中声明d.DNAME
列:
SELECT d.D#,d.DNAME,sum(BUDGET) as "TOTAL BUDGETS"
FROM DEPARTMENT d,PROJECT p
WHERE d.D# = p.D#
GROUP BY d.D#, d.DNAME;
如果要显示所有部门,需要使用左连接
SELECT d.D#,d.DNAME,sum(BUDGET) as "TOTAL BUDGETS"
FROM DEPARTMENT d
LEFT JOIN PROJECT p
ON d.D# = p.D#
GROUP BY d.D#, d.DNAME;
如果没有项目,要显示0,需要使用CASE语句
SELECT d.D#,d.DNAME,
CASE WHEN sum(BUDGET) IS NULL
THEN 0
ELSE sum(BUDGET) END AS "TOTAL BUDGETS"
FROM DEPARTMENT d
LEFT JOIN PROJECT p
ON d.D# = p.D#
GROUP BY d.D#, d.DNAME;
输出:
D# DNAME TOTAL BUDGETS
2 IT 0
1 RESEARCH 45000
3 SEARCH 50000
好的。现在好了。但若部门并没有任何预算,则应显示0。但是为什么我的查询只是显示那些有预算d的人?@user3553846我已经更新了asnwer。然后,您必须使用左外部联接。如果部门没有project@user3553846:您需要将
SUM(p.budget)
替换为NVL(SUM(p.budget),0)
。在Oracle中,没有数据的和是NULL
,而不是零。@user3553846我已经更新了asnwer。必须添加NVL以检查该值是否为空,然后将其替换为0。
D# DNAME TOTAL BUDGETS
2 IT 0
1 RESEARCH 45000
3 SEARCH 50000