Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按返回分组求和错误_Sql_Oracle_Sqlplus - Fatal编程技术网

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