【问题标题】:Mysql Get data for Last Six weeks using JOINMysql 使用 JOIN 获取过去六周的数据
【发布时间】:2016-06-02 05:14:55
【问题描述】:

我通过选择过去六周内完成评估的所有员工数据来编辑查询。从逻辑上讲,如果它在两周内完成了评估,则每个员工应该两次,但此查询显示单个记录。

 select 
   AssessmentEmployee.
   EmployeeName,
   AVG(AssessmentListing.AssessmentScore),
   DATE_FORMAT((STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p')) , '%Y-%m-%v') as _month 
 from AssessmentEmployee 
 LEFT JOIN AssessmentListing 
 ON  AssessmentEmployee.AssessmentID=AssessmentListing.AssessmentID 
 WHERE (STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p') >= DATE_FORMAT(NOW() - INTERVAL 6 Week, '%Y' )) 
 group by AssessmentEmployee.EmployeeName 

我正在使用下表。

AssessmentEmployee
 ID
 AssessmentID
 EmployeeName

其他表是AssessmentListing

ID
AssessmentID
AssessmentSubmittedDateTime
AssessmentScore

我想获取在 Last sex week 中得分/完成评估的员工及其平均得分。

AssessmentListing 数据列示例

ID  AssessmentID     AssessmentSubmittedDatetime     AssessmentScore 
1     040416024720     04-Apr-2016 02:48 PM             50

【问题讨论】:

  • 你需要按week numberemployee name分组。
  • 当您说group by AssessmentEmployee.EmployeeName 时,它要求将EmployeeName 的每个值的所有数据汇总到一行中。所以当然你只会得到一排(不是你期望的两排)。
  • @Turophile 我想说亚当和杰克逊在过去两周内已经完成了所以它应该同时显示,并且如果过去六周中的任何一周没有记录比前几周它应该显示不需要其他几周
  • @1000111 我已经添加了机器人,但它不应该只显示过去六周,而是说最后六周是 22、21、20、19、18、17,所以假设没有数据如果是 21,那么它也会选择 16,如果不能不显示,它应该只显示最后六个
  • AssessmentSubmittedDateTime的数据类型是什么?

标签: mysql sql join


【解决方案1】:

请尝试以下查询:

select 
   AssessmentEmployee.
   EmployeeName,
   AVG(AssessmentListing.AssessmentScore),
   DATE_FORMAT((STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p')) , '%Y-%v') as year_week
 from AssessmentEmployee 
 LEFT JOIN AssessmentListing 
 ON  AssessmentEmployee.AssessmentID=AssessmentListing.AssessmentID 
 WHERE UNIX_TIMESTAMP(DATE_FORMAT(STR_TO_DATE(`AssessmentSubmittedDatetime`,'%d-%b-%Y %I:%i %p'),'%Y-%m-%d')) >= UNIX_TIMESTAMP(CURDATE() - INTERVAL 6 WEEK)
 group by AssessmentEmployee.EmployeeName, year_week;

您不应该将日期/时间存储为字符串。否则,在处理这些繁琐的工作时接受它们。

【讨论】:

  • 你是对的,但我没想到我们会得到这样的报告,这就是为什么使用
  • 那么现在告诉我这行得通吗?你得到预期的输出吗? @DilshadAli
  • 我要出去了,但让我确认一下
  • 如果可以的话,我们可以稍后开始聊天吗
  • 当然。请去吧。
【解决方案2】:

你正在做一个平均,所以如果他们拿了两次,它将平均 2 个分数。

【讨论】:

    【解决方案3】:
    SELECT *, SUM(AssessmentScore) as total, SUM(AssessmentScore)/6 as avg
    FROM `assessmentlisting` 
    WHERE STR_TO_DATE(`AssessmentSubmittedDatetime`, '%d-%b-%Y %I:%i %p') > DATE_FORMAT(NOW() - INTERVAL 6 Week, '%Y-%m-%d %I:%i %p' ) 
    GROUP BY assessmentlisting.AssessmentID
    

    希望它会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2020-05-09
      • 2019-08-14
      • 2017-03-06
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多