2016-03-11 45 views
1

我對MySql的世界比較陌生,對堆棧溢出完全陌生,所以如果這是一個簡單的問題來回答,但我似乎無法解決它。 如果您有一個查詢計算出一個計算結果並按月分組答案,而不是按一個列按月分組,那麼您是否可以將每個月的組分成單獨的列?是否可以將查詢的輸出拆分爲每個月的單獨列?

我有一張表格,記錄每次車輛派遣工作。每個工作可以派出一輛以上的車輛。我想計算每個地點每月按每個工作派遣的平均車輛數量。

我的表稱爲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; 
; 

我真的很感激一些指導請!

+0

我認爲這在技術上是可行按月分成單獨的列,但很可能每個條目都有12列,除1之外全部爲空白。嘗試分割1列中的數據並將其放入其他列中並非典型情況所以需要對規則進行一些操縱。你如何連接數據庫?你能詳細說明你想要的結果嗎?例如,你在尋找12 x N的dispatch_id,job_id,location_id或這些值的組合。 –

+0

請發佈預期產出示例 – MaxU

+0

我原來的評論指出,這在技術上可能是可能的。讓我用這種方式來解決這個問題,當你正在尋找某種違反關係數據庫中「行」的繼承概念時,即與一組特定的錶行相關的一組數據,它們通過您的查詢。爲了僅使用SQL和沒有附加層(如.Net前端)來獲得所需結果,需要進行大量操作,結果可能會很糟糕。 –

回答

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

我無法測試,你沒有發佈數據樣本,但它應該達到你想要的東西后,一些調整

+0

嗨托馬斯G.你是對的一個樞軸正是我所追求的。你的代碼幾乎可以工作,但是我稍微擴展了你給我看的邏輯。我在「/」之後插入了CASE語句。因此,例如,每個月我做了以下內容: –

+0

COUNT(CASE WHEN MONTH(dispatch_datetime)= '01',那麼JOB_ID END) /COUNT(DISTINCT CASE WHEN MONTH(dispatch_datetime)= '01',那麼dispatch_id END)AS AvgJan –

+0

非常感謝您的幫助Thomas G,我爲您向我展示的這段代碼提供了很多用途。我從Stackoverflow學到了幾乎所有關於MySQL的知識,包括INNER JOIN和LEFT JOIN之間的區別。所以很高興終於可以爲自己提出一個問題,並給予一個很好的答案,我可以反覆使用! –

相關問題