2014-03-26 67 views
1

我正在做一份报告,显示我们每周从学校获得的申请人数。我们在15所不同的学校招聘。我目前的查询是这样的。问题是,如果一所学校没有找到申请人,那么他们就不会出现在报告中。即使没有申请人,我怎么能让学校出现?GROUP BY显示0

SELECT 
weekofyear(tbl_job_applications.ja_date) AS 'Week #', 
tbl_universities.univ_name, 
Count(tbl_job_applications.ja_date) AS 'Applicants' 
FROM 
tbl_job_applications 
    Inner JOIN 
tbl_universities ON tbl_job_applications.univ_id = tbl_universities.univ_id 
    Inner JOIN 
tbl_positions ON tbl_job_applications.pos_id = tbl_positions.pos_id 
where year(tbl_job_applications.ja_date) = 2014 
Group by tbl_universities.univ_name , weekofyear(tbl_job_applications.ja_date) 
Order by weekofyear(tbl_job_applications.ja_date) DESC , tbl_universities.univ_name ASC; 
+1

更改内部连接到直接从应用程序到高校参加。如果所有表都具有该值,Inner将仅显示记录。无论在相关表中是否找到匹配,右侧或左侧都会显示表格中左侧或右侧的所有值。 – xQbert

+2

内部连接过滤出来的行,外部连接不行。所以,从主表开始,然后离开应用程序和大学。 –

+0

@xQbert - 快照! –

回答

0

使用LEFT JOINRIGHT JOININNER JOIN排除非加盟值,还需要进行修改,以不排除没有ja_date值的记录您的WHERE标准:

SELECT weekofyear(a.ja_date) AS 'Week #' 
     , u.univ_name 
     , COUNT(a.ja_date) AS 'Applicants' 
FROM tbl_universities u 
LEFT JOIN tbl_job_applications a 
    ON a.univ_id = u.univ_id 
LEFT JOIN tbl_positions p 
    ON a.pos_id = p.pos_id 
WHERE YEAR(a.ja_date) = 2014 OR a.ja_date IS NULL 
GROUP BY u.univ_name 
     , weekofyear(a.ja_date) 
ORDER BY weekofyear(a.ja_date) DESC 
     , u.univ_name ASC; 

注意,这将返回所有univ_name值,但它不会返回每univ_name值对于每周,如果这是你需要创建一个具有全周和univ_name组合的驱动程序后,最容易在子查询中使用CROSS JOIN来完成此操作(在此示例中,它仅限于申请人至少1周的学校,如果你想要整整几周,你必须设置不同的):

SELECT sub.*,COUNT(a.ja_date) 
FROM (SELECT DISTINCT 
      weekofyear(a.ja_date) AS week_ 
      ,u.univ_name 
      ,u.univ_id  
     FROM tbl_job_applications a 
     CROSS JOIN tbl_universities u 
    ) as sub 
LEFT JOIN tbl_job_applications a 
    ON a.univ_id = sub.univ_id 
    AND weekofyear(a.ja_date) = sub.week_ 
LEFT JOIN tbl_positions p 
    ON a.pos_id = p.pos_id 
GROUP BY sub.univ_name 
     ,sub.week_ 
ORDER BY week_ 
     ,sub.univ_name 

两个演示:SQL Fiddle

+0

这个逻辑很有意义。不知道为什么,但这不会产生我期待的结果。它给了我与Inner Join相同的结果。 –

+0

你能提供样本数据吗? –

+0

tbl_universities数据库中有大约100所学校。其中,我们积极招聘15名。这些都是我想显示的tbl_job_applications看起来是这样的 - 申请日期,名称,电子邮件,Univ_ID 目前的出口是这样的 - 学校,周#,申请人的计数, “乔治亚”,” '','1' 'Illinois','13','1' 'Michigan','13','3' 'Ole Miss','13','1' 'Tennessee','13' ','1' –

0

变更查询,以便大学列第一和使用外连接:

FROM tbl_universities 
LEFT JOIN tbl_job_applications 
    ON tbl_job_applications.univ_id = tbl_universities.univ_id 
INNER JOIN tbl_positions 
ON tbl_job_applications.pos_id = tbl_positions.pos_id