【问题标题】:Show COUNT of each possible grade for an employee, showing zero when there are no grade entries显示员工每个可能等级的 COUNT,当没有等级条目时显示为零
【发布时间】:2012-11-12 20:43:40
【问题描述】:

我只有一张桌子。我想显示该员工的成绩和记录该成绩的次数,但如果没有该员工的记录,则该成绩必须显示为 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。

【问题讨论】:

  • 您能发布您的表结构、示例数据以及想要的结果吗?
  • 这可能令人困惑。您需要能够以某种方式确定返回的 0 是否确实意味着“无结果”而不是“0”的实际结果。

标签: sql oracle join


【解决方案1】:

我想你是在问这个?

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

【讨论】:

    【解决方案2】:

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

    select value from tbl;
    

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

       select nvl(t.value, 0) value
         from dual d
    left join tbl t on 1=1;
    

    【讨论】:

      【解决方案3】:

      听起来你想要 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 2012-05-17
        • 1970-01-01
        • 2021-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多