Mysql 是否可以为每个月将查询的输出拆分为单独的列?

Mysql 是否可以为每个月将查询的输出拆分为单独的列?,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我对MySql的世界比较陌生,对Stack Overflow也完全陌生,所以如果这是一个很容易回答的问题,我表示歉意,但我似乎无法解决它。 如果您有一个查询,它计算出一个计算结果,并按月对答案进行分组,而不是将答案按月份分组在一列中,那么您是否可以将每个月的分组拆分为单独的一列 我有一个表格,记录每次派遣车辆执行任务时的情况。每项作业可调度一辆以上的车辆。我想计算出每个工作的平均车辆派遣量,按地点,每月 我的表名为dispatch_log,包含以下列“dispatch_id”、“job_id”、

我对MySql的世界比较陌生,对Stack Overflow也完全陌生,所以如果这是一个很容易回答的问题,我表示歉意,但我似乎无法解决它。 如果您有一个查询,它计算出一个计算结果,并按月对答案进行分组,而不是将答案按月份分组在一列中,那么您是否可以将每个月的分组拆分为单独的一列

我有一个表格,记录每次派遣车辆执行任务时的情况。每项作业可调度一辆以上的车辆。我想计算出每个工作的平均车辆派遣量,按地点,每月

我的表名为dispatch_log,包含以下列“dispatch_id”、“job_id”、“location_id”、“dispatch_datetime”

我用来计算每个工作(按地点)每月平均调度的车辆数量的查询是:

SELECT location_id
      ,CONCAT( YEAR(dispatch_datetime), ' ',MONTH(dispatch_datetime) ) AS month_year
      ,COUNT(job_id)/COUNT(DISTINCT dispatch_id) AS avg_disp_vehicles
FROM dispatch_log
GROUP BY location_id, month_year 
ORDER BY month_year;
;

请给我一些指导,我将不胜感激

如果我理解正确的话,你想要一个月的支点

MySQL中没有PIVOT函数。幸运的是,由于您希望以月份为中心,因此列数始终固定为12,在查询中对所有列进行编码并不困难。 如果你的计划是每年/每月都有一列,你也可以这样做,但你必须硬编码所有的年/月组合,这可能是一个糟糕的设计

最好只保留列的月份,并且每年有不同的行

你应该这样做

SELECT location_id
      , YEAR(dispatch_datetime)  
      ,(COUNT(job_id)/COUNT(DISTINCT dispatch_id) ) AS AvgTotal
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 1 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgJan
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 2 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgFeb
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 3 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgMar
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 4 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgApr
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 5 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgMay
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 6 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgJun
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 7 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgJul
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 8 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgAug
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 9 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgSep
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 10 THEN job_id END)/COUNT(DISTINCT dispatch_id) ) AS AvgOct
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 11 THEN job_id END)/COUNT(DISTINCT dispatch_id) ) AS AvgNov
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 12 THEN job_id END)/COUNT(DISTINCT dispatch_id) ) AS AvgDec  
FROM dispatch_log
GROUP BY location_id, YEAR(dispatch_datetime)  
ORDER BY YEAR(dispatch_datetime) ;
;

我无法测试,因为您没有发布数据样本,但经过一些调整后,它应该可以达到您想要的效果

如果我理解正确,您需要几个月的时间

MySQL中没有PIVOT函数。幸运的是,由于您希望以月份为中心,因此列数始终固定为12,在查询中对所有列进行编码并不困难。 如果你的计划是每年/每月都有一列,你也可以这样做,但你必须硬编码所有的年/月组合,这可能是一个糟糕的设计

最好只保留列的月份,并且每年有不同的行

你应该这样做

SELECT location_id
      , YEAR(dispatch_datetime)  
      ,(COUNT(job_id)/COUNT(DISTINCT dispatch_id) ) AS AvgTotal
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 1 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgJan
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 2 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgFeb
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 3 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgMar
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 4 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgApr
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 5 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgMay
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 6 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgJun
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 7 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgJul
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 8 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgAug
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 9 THEN job_id END) /COUNT(DISTINCT dispatch_id) ) AS AvgSep
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 10 THEN job_id END)/COUNT(DISTINCT dispatch_id) ) AS AvgOct
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 11 THEN job_id END)/COUNT(DISTINCT dispatch_id) ) AS AvgNov
      ,(COUNT(CASE WHEN MONTH(dispatch_datetime) = 12 THEN job_id END)/COUNT(DISTINCT dispatch_id) ) AS AvgDec  
FROM dispatch_log
GROUP BY location_id, YEAR(dispatch_datetime)  
ORDER BY YEAR(dispatch_datetime) ;
;

我无法进行测试,因为您没有发布数据样本,但经过一些调整后,它应该可以达到您想要的效果

我认为技术上可以按月拆分为单独的列,但最有可能的情况是每个条目有12列,除1列外,所有列都是空白的。这不是一种典型的情况,尝试将数据从一列中拆分并放入其他列中,因此需要对规则进行一些操作。你是如何连接到数据库的?你能详细说明你想要什么结果吗?例如,您是在寻找一个12 x N的调度id、作业id、位置id网格,还是这些值的组合。请发布一个预期输出的示例。我的原始评论指出,这在技术上可能是可行的。当您在寻找某种类型的违反继承概念的关系数据库中的“行”是什么时,让我来说明这一点,也就是说,与通过查询链接在一起的特定表行集相关的一组数据。要仅使用SQL而不使用其他层(如.Net前端)获得所需的结果,需要进行大量的操作,结果可能很难读取。我认为从技术上讲,可以按月份划分为单独的列,但最有可能的是每个条目有12列,除1列外,所有列均为空。这不是一种典型的情况,尝试将数据从一列中拆分并放入其他列中,因此需要对规则进行一些操作。你是如何连接到数据库的?你能详细说明你想要什么结果吗?例如,您是在寻找一个12 x N的调度id、作业id、位置id网格,还是这些值的组合。请发布一个预期输出的示例。我的原始评论指出,这在技术上可能是可行的。当您在寻找某种类型的违反继承概念的关系数据库中的“行”是什么时,让我来说明这一点,也就是说,与通过查询链接在一起的特定表行集相关的一组数据。为了只使用SQL而不使用其他层(如.Net前端)获得所需的结果,需要进行大量操作,结果可能很难阅读。嗨,Thomas G.你说得对,PIVOT正是我想要的。您的代码几乎可以正常工作,但我稍微扩展了您向我展示的逻辑。我在“/”后面插入了CASE语句,与前面一样。例如,对于每个月,我都会做以下操作:COUNT(CASE WHEN month(dispatch_datetime)='01'然后job_id END)/COUNT(不同的CASE WHEN month(dispatch_datetime)='01'然后dispatch id END)作为AvgJanThank非常感谢您的帮助Thomas G,您向我展示的这段代码有很多用处。我几乎从Stackoverflow中学到了关于MySQL的所有知识,包括内部连接和左连接之间的区别等基础知识。所以,很高兴终于能为自己问一个问题,并得到一个我可以反复使用的极好的答案!嗨,托马斯·G,你说得对,一个支点正是我想要的。您的代码几乎可以正常工作,但我稍微扩展了您向我展示的逻辑。我在“/”后面插入了CASE语句,与前面一样。例如,对于每个月,我都会做以下操作:COUNT(CASE WHEN month(dispatch_datetime)='01'然后job_id END)/COUNT(不同的CASE WHEN month(dispatch_datetime)='01'然后dispatch id END)作为AvgJanThank非常感谢您的帮助Thomas G,您向我展示的这段代码有很多用处。我几乎从Stackoverflow中学到了关于MySQL的所有知识,包括内部连接和左连接之间的区别等基础知识。所以我很高兴终于能为自己问一个问题,并得到一个前男友