【问题标题】:In Join condition I want to use group by and having clause but get error? How to use group by and having clause在加入条件中,我想使用 group by 和 having 子句但出现错误?如何使用 group by 和 having 子句
【发布时间】:2017-03-01 12:22:10
【问题描述】:

当我想从 it_Service_ticket 表中获取数据时。错误是

“有条款”中的未知列“it_service_ticket.xetr”

如何使用 group by 和有条件?请帮帮我

SELECT Assignedto,COUNT(Assignedto) as TC
,CONCAT(count(case when STATUS = 'CLOSE' then 1 else null end) * 100 / count(1), '%') as SC
,CONCAT(count(case when STATUS = 'PENDING' then 1 else null end) * 100 / count(1), '%') as PC
,SUM(TIMESTAMPDIFF(MINUTE,Request_Date, Xetr))/60 as WH ,(540-sum(TIMESTAMPDIFF(MINUTE,Request_Date, Xetr)))/60 as VH,
COUNT(Feedback_Rate)/COUNT(Assignedto)*100   as Feed_Percent,
SUM(Feedback_Rate)/(count(Feedback_Rate)*5)*5 as AVG_Feedback
FROM `it_service_ticket`
INNER JOIN `it_problem`
ON `it_service_ticket`.`it_problem_id`=`it_problem`.`it_problem_id`
INNER JOIN `city_master`
ON `it_service_ticket`.cityid=`city_master`.city_id

GROUP BY Assignedto
HAVING `it_service_ticket`.`xetr` BETWEEN '2017-01-01 12:00:00 AM' AND '2017-03-31 12:00:00 PM'
              ;

【问题讨论】:

  • 你说要使用group by和have,怎么来的? (因为你不知道如何使用它们......)
  • 是的,我知道,但在我的查询中它不起作用。

标签: mysql sql database database-design relational-database


【解决方案1】:

我想你只想要where,而不是having

SELECT Assignedto, COUNT(Assignedto) as TC,
       CONCAT(AVG(STATUS = 'CLOSE') * 100, '%') as SC,
       CONCAT(AVG(STATUS = 'PENDING') * 100, '%') as PC,
       SUM(TIMESTAMPDIFF(MINUTE, Request_Date, Xetr))/60 as WH ,
       (540-SUM(TIMESTAMPDIFF(MINUTE, Request_Date, Xetr)))/60 as VH,
       COUNT(Feedback_Rate)/COUNT(Assignedto)*100 as Feed_Percent,
       SUM(Feedback_Rate)/(count(Feedback_Rate)*5)*5 as AVG_Feedback
FROM it_service_ticket st INNER JOIN
     it_problem` p
     ON st.it_problem_id = p.it_problem_id INNER JOIN
     `city_master` cm
     ON st.cityid = cm.city_id
WHERE st.xetr BETWEEN '2017-01-01 00:00:00' AND '2017-03-31 12:00:00'
GROUP BY Assignedto;

一般情况下,仅在对聚合函数进行过滤时才使用HAVING

注意事项:

  • 我简化了计算比率的逻辑。您可能希望使用 format() 来获取特定的小数位数。
  • 如果没有必要,不要使用反引号。它们只是使查询更难编写和阅读。
  • 同样,表别名使查询更易于编写和阅读。
  • 使用 24 小时时间格式 - 更不容易出错。
  • 我怀疑Feed_Percent 的计算是否正确。 COUNT() 计算非NULL 值的数量,因此它们的比率可能为 1。

【讨论】:

    【解决方案2】:

    您必须在选择字段中添加Xetr。如果不使用它,您将无法将having 条件与Xetr 一起使用。
    试试这个

    SELECT Assignedto,COUNT(Assignedto) as TC
    ,CONCAT(count(case when STATUS = 'CLOSE' then 1 else null end) * 100 / count(1), '%') as SC
    ,CONCAT(count(case when STATUS = 'PENDING' then 1 else null end) * 100 / count(1), '%') as PC
    ,SUM(TIMESTAMPDIFF(MINUTE,Request_Date, Xetr))/60 as WH ,(540-sum(TIMESTAMPDIFF(MINUTE,Request_Date, Xetr)))/60 as VH,
    COUNT(Feedback_Rate)/COUNT(Assignedto)*100   as Feed_Percent,
    SUM(Feedback_Rate)/(count(Feedback_Rate)*5)*5 as AVG_Feedback,Xetr
    FROM `it_service_ticket`
    INNER JOIN `it_problem`
    ON `it_service_ticket`.`it_problem_id`=`it_problem`.`it_problem_id`
    INNER JOIN `city_master`
    ON `it_service_ticket`.cityid=`city_master`.city_id
    
    GROUP BY Assignedto
    HAVING `it_service_ticket`.`Xetr` BETWEEN '2017-01-01 12:00:00 AM' AND '2017-03-31 12:00:00 PM';
    

    但在我的观点中,您必须在 where 子句中使用 Xetr 以提高性能,如下所述:

    SELECT Assignedto,COUNT(Assignedto) as TC
    ,CONCAT(count(case when STATUS = 'CLOSE' then 1 else null end) * 100 / count(1), '%') as SC
    ,CONCAT(count(case when STATUS = 'PENDING' then 1 else null end) * 100 / count(1), '%') as PC
    ,SUM(TIMESTAMPDIFF(MINUTE,Request_Date, Xetr))/60 as WH ,(540-sum(TIMESTAMPDIFF(MINUTE,Request_Date, Xetr)))/60 as VH,
    COUNT(Feedback_Rate)/COUNT(Assignedto)*100   as Feed_Percent,
    SUM(Feedback_Rate)/(count(Feedback_Rate)*5)*5 as AVG_Feedback,Xetr
    FROM `it_service_ticket`
    INNER JOIN `it_problem`
    ON `it_service_ticket`.`it_problem_id`=`it_problem`.`it_problem_id`
    INNER JOIN `city_master`
    ON `it_service_ticket`.cityid=`city_master`.city_id
    where `it_service_ticket`.`Xetr` BETWEEN '2017-01-01 12:00:00 AM' AND '2017-03-31 12:00:00 PM'
    GROUP BY Assignedto;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-15
      • 2016-02-05
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多