【问题标题】:SQL - Grouping by Last Day of QuarterSQL - 按季度最后一天分组
【发布时间】:2020-03-05 20:32:27
【问题描述】:

我目前正在运行一个查询,以计算代理的平均调查分数。我们使用 LastDayOfTheQuarter 和 180 天前的日期范围来计算这些分数。我在本季度遇到了一个问题。

我的一位代理人在 2020 年没有收到任何调查,这导致查询无法提取当前的 lastdayofquarter 和 180 天的结果。

我正在使用的代码:

SELECT
Agent,
U.Position,
U.BranchDescription,
(ADDDATE(LastDayOfQuarter, -180)) AS MinDate, 
(LastDayOfQuarter) AS MaxDate,
COUNT(DISTINCT Response ID) as SurveyCount,
AVG(CASE WHEN Question ID = Q1_2 THEN Answer Value END) AS EngagedScore, 
AVG(CASE WHEN Question ID = Q1_3 THEN Answer Value END) AS KnowledgableScore, 
AVG(CASE WHEN Question ID = Q1_6 THEN Answer Value END) AS ValuedScore
FROM qualtrics_responses
LEFT JOIN date D
ON (D.`Date`) = (DATE(`End Date`))
LEFT JOIN `users` U 
ON U.`UserID` = `Agent ID`
WHERE `Agent` IS NOT NULL 
AND DATE(`End Date`) <= (`LastDayOfQuarter`) 
AND DATE(`End Date`) >= (ADDDATE(`LastDayOfQuarter`, -180))
GROUP BY  `Agent`,  (ADDDATE(`LastDayOfQuarter`, -180))

我知道问题出在我加入日期的方式上,而且由于他在本年度没有结果,因此加入日期的结束日期没有抓住所需的日期范围。我似乎想不出任何替代方案。任何帮助表示赞赏。

【问题讨论】:

  • 哪个dbms???如果有人给你解决错误的 dbms 是没用的。
  • 学会正确使用GROUP BY 。为什么U.PositionU.BranchDescriptionLastDayOfQuarter 不在GROUP BY 中?
  • @Eric:这闻起来像 MySQL/MariaDB
  • date 表是什么样的?

标签: sql date join


【解决方案1】:

我假设您查询中的表 date 是一个日历表,它存储季度的开始和结束(很可能每个季度的每个日期都有一行)。

如果是这样,您可以通过重新排列 joins 来解决此问题:首先 cross join 用户和日历表以生成所有可能的组合,然后使用 left join 引入调查表:

SELECT
    U.UserID,
    U.Position,
    U.BranchDescription,
    D.LastDayOfQuarter - interval 180 day AS MinDate, 
    D.LastDayOfQuarter AS MaxDate,
    COUNT(DISTINCT Q.ResponseID) as SurveyCount,
    AVG(CASE WHEN Q.QuestionID = 'Q1_2' THEN Q.Answer Value END) AS EngagedScore, 
    AVG(CASE WHEN Q.QuestionID = 'Q1_3' THEN Q.Answer Value END) AS KnowledgableScore, 
    AVG(CASE WHEN Q.QuestionID = 'Q1_6' THEN Q.Answer Value END) AS ValuedScore
FROM date D 
CROSS JOIN users U 
LEFT JOIN qualtrics_responses Q 
    ON  Q.EndDate >= D.Date
    AND Q.EndDate < D.Date + interval 1 day
    AND U.UserID = Q.AgentID
    AND Q.Agent IS NOT NULL
GROUP BY 
    U.UserID,
    U.Position,
    U.BranchDescription,
    D.LastDayOfQuarter

注意事项:

  • 我调整了日期算法 - 这假设您使用的是 MySQL,正如查询的语法所暗示的那样

  • 您应该真正限定查询中的所有列,方法是在它们前面加上它们所属表的别名;这使得查询更容易理解。我试过了,你可能需要复习一下。

  • All 非聚合列应出现在 group by 子句中(另见 Eric 的评论);这是大多数数据库的要求,也是任何地方的良好做法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2010-09-23
    相关资源
    最近更新 更多