2013-07-09 44 views
0

我想讓下面的代碼運行多個結束日期。那些結束日期必須是該月的第一天。 我可以執行代碼幾次,同時改變結束日期我自己,但多數人的工作,我想從2001年到現在的蒙特利數據。所以我的猜測是我必須循環這個?MYSQL循環此代碼

這裏是代碼我使用:

Select t4.Count, t4.Status 
From(
    SELECT count(l.VoerID) as Count, l.Datum, l.Status, l.LogID 
     FROM (
      SELECT k.VoerID, k.Datum, MAX(k.LogID) AS LogID 
       FROM DB.LogStatus k 
       Where Datum > '2001-01-01' 
       and Datum < '2013-07-01' 
       GROUP BY k.VoerID 
      ) m 
     JOIN DB.LogStatus l 
     ON l.VoerID = m.VoertuigID AND l.LogID = m.LogID 
    Where status in ('x',y,'z') 
    Group by Status 
)t4 

誰能提供幫助?

編輯::::: @STEPH

當我使用這個代碼和平(1):

SELECT VoertID,max(LogID) as MaxLogID,Datum 
      from DB.LogStatus 
WHERE Datum >= '2001-01-01' 
        and Datum < '2013-07-01' 
and VoerID = '50789' 
GROUP BY VoerID 

我得到VoerID 50789與上LOGID但沒有相應的日期。這可能嗎?

+0

有許多選擇,但你可以把它在shell腳本/批處理文件中或使用類似php的東西。 使用一些簡單的Unix/Linux工具(如awk)甚至可以很好地格式化輸出。 –

+0

嗯,我可以在Mysql或這個代碼中做到這一點。 (即時通訊相當新的一個...)以及如何? – DBek

+0

你打算如何處理按狀態分組的數據?會有一個結果集有'Month,Status,LogID *,Datum *,Count'嗎?*這些都是FIRST發生的值,因爲它們不在組中 –

回答

0

根據您的輸出,您需要操縱日期以始終返回本月的第一個月份。

在下面的SQL中,我提出了一個方法來解決這個問題,這個方法包括確定一個月的開始日期(相對於每個日期)有多少天並且減少了它。

SELECT date_sub(Datum,interval day(Datum)-1 day) datum, status, count(l.VoerID) as count 
    FROM DB.LogStatus l 
INNER JOIN (SELECT VoerID,max(LogID) as MaxLogID 
      from DB.LogStatus 
WHERE Datum >= '2001-01-01' 
        and Datum < '2013-07-01' 
GROUP BY VoerID) maxl on l.VoerID=Maxl.VoerID and l.LogID=Maxl.MaxLogID 

Where status in ('x','y','z') 
and Datum >= '2001-01-01' 
       and Datum < '2013-07-01' 

GROUP BY date_sub(Datum,interval day(Datum)-1 day),status 

打破你原來的代碼:

  1. 返回對於給定VoerID,返回的第一個日期和MAX LOGID

     SELECT k.VoerID, k.Datum, MAX(k.LogID) AS LogID 
         FROM DB.LogStatus k 
    
         Where Datum > '2001-01-01' 
    
         and Datum < '2013-07-01' 
    
         GROUP BY k.VoerID  
    
  2. 獲取從日誌在狀態的所有項目處於一個範圍內,並且LogID匹配且表中的VoerID與派生表中的VoertuigID(實際上不存在於代碼中)匹配。通過日誌狀態和集團獲得第一個數據,FIRST LOGID和COUNT從2

 SELECT count(l.VoerID) as Count, l.Datum, l.Status, l.LogID 
      FROM (   step1   ) m 
      JOIN DB.LogStatus l 
       ON l.VoerID = m.VoertuigID AND l.LogID = m.LogID 
      Where status in ('x',y,'z') 
      Group by Status 
  • 返回計數和狀態欄修改後的代碼所做的:

    1. 標識最後在特定日期內每個VoerID的LogID

      SELECT VoerID,max(LogID) as MaxLogID 
            from DB.LogStatus 
      WHERE Datum >= '2001-01-01' 
              and Datum < '2013-07-01' 
      GROUP BY VoerID 
      
    2. 限制登錄這些最大LogIDs,然後過濾器上的相關狀態,然後統計每首月的每個狀態的行數

      SELECT date_sub(Datum,interval day(Datum)-1 day) datum, status, count(l.VoerID) as count 
      
      FROM DB.LogStatus l 
      INNER JOIN (m ) maxl on l.VoerID=Maxl.VoerID and l.LogID=Maxl.MaxLogID 
      Where status in ('x','y','z') 
      and Datum >= '2001-01-01' 
      and Datum < '2013-07-01' 
      GROUP BY date_sub(Datum,interval day(Datum)-1 day),status 
      
  • +0

    我沒有得到....我認爲我的sql中的部分:和基準<'2013-07-01' 應該是可變的基於某些「第一個月」。所以可以說過去三年。你的代碼如何適應? – DBek

    +0

    我已經添加了where子句 - 調整後的基準列將所有內容都帶到了本月的第一個月,以便每個月最多可以有三行(每個狀態)。如果你需要操縱你想要顯示的月份,你會調整WHERE子句以適應。再次,您可以進行日期算術以使這種動態的最近3年。 –

    +0

    當我運行該代碼時,我得到錯誤的計數。我的代碼旨在獲得正確的計數。似乎我需要在我的代碼中的某處添加date_sub ....我要去猜一下... :-) – DBek