-2

我只有一张桌子。我想显示该员工的成绩和记录该成绩的次数,但如果该员工没有记录,则必须显示该成绩为 0。当存在两个表时,我知道如何使用左连接来执行此操作,但我只有 1 个表。

这怎么可能?

例如:

empID |  dept  |  grade
 1    |   11   |    a
 2    |   11   |    a
 3    |   11   |    b
 1    |   22   |    c
 2    |   22   |    f
 3    |   22   |    d
 1    |   33   |    a
 2    |   33   |    a
 3    |   33   |    a

例如,如果我运行SELECT grade, count(grade) from table where empID = 1 Group by grade;,它最终只会打印出员工获得的成绩和计数。现在我还想为员工没有的成绩打印出 0。

4

3 回答 3

3

我想你要这个?

SQL> select e.grade, count(e2.empid)
  2         from (select distinct grade from e) e
  3              left outer join e e2
  4                           on e2.grade = e.grade
  5                          and e2.empid = 1
  6        group by e.grade
  7        order by grade;


G COUNT(E2.EMPID)
- ---------------
a               2
b               0
c               1
d               0
f               0

或者因为您没有带有“e”等级的行,那么如果您有一个名为等级的查找表:

SQL> select * from grade;

G
-
a
b
c
d
e
f

SQL> select e.grade, count(e2.empid)
  2    from grade emp
  3          left outer join emp e2
  4                       on e2.grade = e.grade
  5                      and e2.empid = 1
  6    group by e.grade
  7    order by grade;

G COUNT(E2.EMPID)
- ---------------
a               2
b               0
c               1
d               0
e               0
f               0
于 2012-11-12T21:22:47.977 回答
1

假设您选择一个值的查询是:

select value from tbl;

如果 tbl t 中没有行,您可以确保返回 0:

   select nvl(t.value, 0) value
     from dual d
left join tbl t on 1=1;
于 2012-11-12T20:50:33.600 回答
0

听起来你想要 NVL 功能。使用 NVL,如果值为空,您可以有条件地返回替代值。请参阅文档。

所以,如果你有以下...

SELECT fooName, fooNumber FROM foo

这些是你的结果

fooName, fooNumber
Blah, 1
Asdf, null
Qwer, 3
poiu, null

你可以像这样重写查询......

SELECT fooName, NVL(fooNumber, 0) FROM foo

你的结果现在是......

fooName, fooNumber
Blah, 1
Asdf, 0
Qwer, 3
poiu, 0

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm

于 2012-11-12T20:50:38.083 回答