2013-07-09 45 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