2010-09-28 102 views
0

快速查看并再次找不到我的问题。所以我希望这里有人能够帮助。 我有一个与下面类似结构的大桌子。mysql按小时汇总多个列

DateTime | InboundUserID | OutboundUserID | CustomerUserID | Cost | Mins | Account Number

我想组以上数据为每小时块,结果在另一台具有相似结构存储到下面。

Date | HourFrom | HourTo | SumMins | SumCost | OutboundUserID | CustomerUserID | Account Number

我已经写了下面的代码/查询为了做到这一点,但它并不完全正确。基本上这个小组意味着并不是所有的数据都被汇总。例如,当查看新创建的表时,我拥有所有OutboundUserID数据,但没有任何CustomerUserID数据。

for(int i=0;i <=23;i++) 
    { 
     for(int j=1 ; j <=31 ; j++) 
     { 
      String Time = String.format("%02d", i); 

      query = "INSERT DELAYED INTO correlated_calls_hourly " + 
        " SELECT DateOnly,HourFrom,HourTo,DURATION,CALLCOUNT,`Price Group ID`,INBOUNDCOST,INBOUNDREVENUE,`InboundCustomerID`,OUTBOUNDCOST,OUTBOUNDREVENUE,`Outbound Customer ID`,`Customer ID`,`Account Number`,`Service` FROM" + 
        " ("+ 
         " SELECT "+ 
         /* snip sum(),case and date/time part of query */ 
         " GROUP BY DateOnly,`InboundCustomerID`,`OutboundCustomerID`,`CustomerID`,`AccountNumber`,`PriceGroupID`,`Service`" + 
        ")a "; 
     } 
    } 

我已经采取了创建三个不同的表由OutboundUserID/InboundUserID/CustomerUserID分别汇总数据的步骤。但如果我可以让这个总结表正确工作,那将会更加优雅。

如果有人可以帮助我想办法通过单个sql查询来获得所需的结果,我会非常感激。

提前感谢

艾伦

+0

你有没有考虑过使用视图?如果您只是想将数据连接在一起以形成一种“报告”表格,创建单个表格似乎有点过分。 – DrColossos 2010-09-28 10:43:55

+0

我曾想过这件事。不幸的是,大桌子现在有1200万行,每天增长大约500,000行。我相信这是超出了简单观点的范围? – 2010-09-28 12:39:02

回答

0

会是这样的工作?

INSERT INTO correlated_calls_hourly (Date, HourFrom, HourTo, SumMins, SumCost, OutboundUserID, CustomerUserID, AccountNumber) 
SELECT 
    CONVERT(varchar(8), GETDATE(), 112), 
    hour(DateTime), 
    hour(DateTime) + 1, 
    SUM(Mins), 
    SUM(Cost), 
    OutboundUserID, 
    CustomerUserID, 
    AccountNumber 
GROUP BY 
    CONVERT(varchar(8), GETDATE(), 112), 
    hour(DateTime) 
    OutboundUserID, 
    CustomerUserID, 
    AccountNumber 

convert函数将datetime转换为日期。你可能需要稍微调整一下以适应你的RDBMS,但我看不出有什么理由不起作用。

+0

感谢您的回复。问题在于由多个键值(InboundUserID | OutboundUserID | CustomerUserID)组成的分组不能正常工作。 – 2010-10-11 10:58:10

0

经过一番激励,我意识到解决方案是显而易见的。将这些列重新组合在一起,并在连接列上进行分组。

CONCAT(InboundUserID, '',OutboundUserID, '',CustomerUserID)作为唯一键 GROUP BY唯一键。