如何用平均值函数和where子句连接两个表?的SQL

时间:2018-12-01 20:25:01

标签: mysql sql

我下面有两个带有以下信息的表

project.analytics 
        | proj_id | list_date  | state  
        |   1     |   03/05/10 |   CA   
        |   2     |   04/05/10 |   WA   
        |   3     |   03/05/10 |   WA   
        |   4     |   04/05/10 |   CA   
        |   5     |   03/05/10 |   WA   
        |   6     |   04/05/10 |   CA   

employees.analytics 
        | employee_id  | proj_id  | worked_date
        |   20         |   1      | 3/12/10    
        |   30         |   1      | 3/11/10         
        |   40         |   2      | 4/15/10     
        |   50         |   3      | 3/16/10     
        |   60         |   3      | 3/17/10     
        |   70         |   4      | 4/18/10   

我可以写什么查询来确定项目前7天中按月和州列出的唯一员工的平均数量?

所需的输出:

     | list_date | state  | # Unique Employees of projects first 7 day list 
     |   March   |   CA   |   1
     |   April   |   WA   |   2
     |   July    |   WA   |   2
     |   August  |   CA   |   1

我的尝试

    select 
        month(list_date),
        state_name, 
        count(*) as Projects,
    from projects 
    group by
        month(list_date),
        state_name;

我知道接下来的步骤是减去work_date-list_date,如果值<7,则从第二张表中平均雇员人数,但是我不确定要使用哪些查询功能。

2 个答案:

答案 0 :(得分:0)

您可以使用带有DISTINCT的CASE来计算在list_date的前7天内工作的唯一员工。

一旦您拥有每个项目的员工总数,便可以计算出每个月和每个州的平均值。

SELECT 
 MONTHNAME(list_date) as `ListMonth`,
 state,
 AVG(TotalUniqEmp7Days) AS `Average Unique Employees of projects first 7 day list`
FROM
( 
   SELECT 
     proj.proj_id,
     proj.list_date,
     proj.state,
     COUNT(DISTINCT CASE 
                    WHEN emp.worked_date BETWEEN proj.list_date and DATE_ADD(proj.list_date, INTERVAL 6 DAY)
                    THEN emp.employee_id
                    END) AS TotalUniqEmp7Days
     -- , COUNT(DISTINCT emp.employee_id) AS TotalUniqEmp
     FROM project.analytics proj
     LEFT JOIN employees.analytics emp ON emp.proj_id = proj.proj_id
     GROUP BY proj.proj_id, proj.list_date, proj.state
) AS ProjectTotals
GROUP BY YEAR(list_date), MONTH(list_date), MONTHNAME(list_date), state;

可以找到Sql Fiddle测试here

答案 1 :(得分:-1)

我认为这是您想要的代码

select
p.list_date, p.state,
emp.no_of_unique_emp 
from project.analytics p
inner join (
  select
  t.project_id,
  count(t.employee_id) as no_of_unique_emp
  from (
    select distinct employee_id, project_id
    from employees.analytics
  ) t
  group by t.project_id
) emp
on emp.project_id = p.project_id
where datediff (p.list_date, getdate()) <= 7