Mysql 按月份和不同值的列分组

Mysql 按月份和不同值的列分组,mysql,Mysql,我在尝试创建一个查询时遇到问题,该查询允许我按月份和具有不同值的列进行分组 下面是我需要查询的表和列的一个小表示 表名为requests,有两列date和status。状态可能具有挂起、出席、缺席和取消的值 我想得到一个如下所示的查询 现在我正在尝试对每个可能值的状态进行子查询。它可以工作,但查询速度非常慢。8000行大约需要48秒 SELECT MONTHNAME(date) (SELECT count(status) FROM requests WHERE status =

我在尝试创建一个查询时遇到问题,该查询允许我按月份和具有不同值的列进行分组

下面是我需要查询的表和列的一个小表示

表名为requests,有两列date和status。状态可能具有挂起、出席、缺席和取消的值

我想得到一个如下所示的查询

现在我正在尝试对每个可能值的状态进行子查询。它可以工作,但查询速度非常慢。8000行大约需要48秒

SELECT
    MONTHNAME(date)
    (SELECT count(status) FROM requests WHERE status = "pending"),
    (SELECT count(status) FROM requests WHERE status = "attended"),
    (SELECT count(status) FROM requests WHERE status = "absent"),
    (SELECT count(status) FROM requests WHERE status = "canceled")
FROM request
GROUP BY 1;

关于如何有效地获得结果,有什么建议吗?非常感谢

您可以在状态上使用case,而不是几个subselect

  select  
        MONTHNAME(date) 
      , sum( case when status = "pending" then 1 else 0 end) pending
      , sum( case when status = "attended" then 1 else 0 end) attended
      , sum( case when status = "absent" then 1 else 0 end) absent
      , sum( case when status = "canceled" then 1 else 0 end) canceled
  FROM request
  GROUP BY  MONTHNAME(date) ;

您可以在状态上使用case,而不是几个subselect

  select  
        MONTHNAME(date) 
      , sum( case when status = "pending" then 1 else 0 end) pending
      , sum( case when status = "attended" then 1 else 0 end) attended
      , sum( case when status = "absent" then 1 else 0 end) absent
      , sum( case when status = "canceled" then 1 else 0 end) canceled
  FROM request
  GROUP BY  MONTHNAME(date) ;

考虑应用程序CODECOND处理应用程序CODENE中数据显示问题的数据显示问题……但是您能使用动态创建另一个查询吗?query@AnkitAgrawal你的评论我不清楚(似乎与问题无关)我是说,你能不能以动态查询的形式编辑你的答案,其中状态的输入值是dynamic@AnkitAgrawal在这种情况下,状态的非dinamic值使用case。。我认为要找到一个像SQL一样的dinamic查询解决方案并不容易。。可能正在使用服务器端语言生成查询。。最后试着把一个新的问题恰当地描述出来。。可能是其他人能够找到解决方案很好…但是你能用dynamic为这个创建另一个查询吗query@AnkitAgrawal你的评论我不清楚(似乎与问题无关)我是说,你能不能以动态查询的形式编辑你的答案,其中状态的输入值是dynamic@AnkitAgrawal在这种情况下,状态的非dinamic值使用case。。我认为要找到一个像SQL一样的dinamic查询解决方案并不容易。。可能正在使用服务器端语言生成查询。。最后试着把一个新的问题恰当地描述出来。。可能是其他人能找到解决办法