2015-12-22 52 views
1

一个查询,该查询应给出具有年份的输出作为该年度雇用的雇员的列名和编号。聘用日期将是他们在列hire_date。 我写了代码它像 SELECT count(e.employee_id) total, count(a.employee_id) _2002, count(b.employee_id) _2003, count(c.employee_id) _2004, count(d.employee_id) _2005 FROM hr.employees e, (select employee_id from hr.employees where extract(year from hire_date)=2002) a, (select employee_id from hr.employees where extract(year from hire_date)=2003) b, (select employee_id from hr.employees where extract(year from hire_date)=2004) c, (select employee_id from hr.employees where extract(year from hire_date)=2005) d;
它在每一列显示'0'。我哪里错了?from from子句的集合函数

注意:所有条件都存在数据。

回答

1
  • 通过观察你的代码,您正在使用多个表中的FROM子句用逗号作为分隔符这是一个隐CROSS JOIN返回行的笛卡尔积从表中加入。其结果是来自表A的行乘以来自表B的行,其中1:1匹配。如果每个表有10行并且有1:1的匹配,那么结果将是100行(简而言之,它将返回匹配的所有行from both tables)。在您的情况下,您的表列表中没有匹配的行以使它们的行唯一的,这样的结果显然会对等于0

  • 或者WHERE子句/条件,你只需要使用case语句和聚合函数SUM,让您预期的结果,而无需使用多个表或像这样:

SELECT count(employee_id) total, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2002 THEN 1 ELSE 0 END) col_1999, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2003 THEN 1 ELSE 0 END) col_1998, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2004 THEN 1 ELSE 0 END) col_1997, 
      SUM(CASE WHEN EXTRACT(YEAR FROM hire_date)=2005 THEN 1 ELSE 0 END) col_1996 
      FROM hr.employees ; 

请注意,在查询中使用逗号分隔多个表(IMPLICT JOIN)仍然适用于ORACLE,但最好使用EXPLICIT JOIN。 Read this to know why it is better to use EXPLICIT than IMPLICIT JOIN

1

我利用狭缝不同的方法 SELECT count(employee_id) total, t1.a _2002, t2.b _2003, t3.c _2004, t4.d _2005 FROM hr.employees, (select count(employee_id) as a from hr.employees where extract(year from hire_date)=2002) t1, (select count(employee_id) as b from hr.employees where extract(year from hire_date)=2003) t2, (select count(employee_id) as c from hr.employees where extract(year from hire_date)=2004)t3, (select count(employee_id) as d from hr.employees where extract(year from hire_date)=2005) t4 group by t1.a , t2.b ,t3.c ,t4.d; 它给出了相同的答案得到的结果。但我想知道为什么问题 中的查询不起作用。请给我理由。 谢谢。