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

时间:2016-03-11 17:25:32

标签: mysql sql aggregate-functions

我对MySql的世界相对较新,对Stack Overflow来说是全新的,所以如果这是一个容易回答的问题而道歉,但我似乎无法解决这个问题。 如果您有一个计算出计算的查询并按月对答案进行分组,而不是将答案按月分组在一列中,您是否可以将这些组拆分为每个月的单独一列?

我有一张表,记录每次为工作派遣车辆时。每项工作都可以派出多辆车。我想计算出按地点,每月为每项工作分派的平均车辆数量。

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

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

import matplotlib.pyplot as plt
import pandas as pd
from pandas_datareader import data

test_df = data.get_data_yahoo('AAPL', start='2015-10-01')
test_df = test_df.resample('W', how='sum')['Volume']
fig, ax = plt.subplots()
ax.bar(test_df.index, test_df, edgecolor='None')

我真的很感激一些指导!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你需要几个月的PIVOT。

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) ;
;

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