每个月递归选择两个字段

时间:2013-05-15 12:59:02

标签: sql

Indroduction

我正在使用FreeRadius,我想查询我的表格radacct并在指定年份内选择两个字段(datetime字段)并提供{{1}每月SUMbytes_send

我的数据库布局

bytes_received

数据库数据

fieldtype    fieldname
---------    ----------
varchar      username
datetime     start
datetime     end
bigint       bytes_send
bigint       bytes_received

期望的输出

我希望得到一个类似这样的查询(SQL查询只需知道年份(本例中为username start end bytes_send bytes_received --------- ------------------- ------------------- ---------- -------------- admin 2013-04-22 22:14:34 2013-04-22 22:24:51 8723142 851314 admin 2013-05-14 11:50:50 2013-05-15 11:58:35 11073753 958437 admin 2013-05-14 14:36:24 2013-05-15 15:11:59 869125711 3152551 admin 2013-05-15 20:45:16 2013-05-15 20:47:11 2373753 114857 demo 2013-05-14 23:21:51 2013-05-15 05:32:20 59125919 3815816 )和用户名(本例中为2013

admin

我的解决方案

我可能会用PHP做这件事,我设置了一年(在这种情况下为username month total_bytes -------- ----- ----------- admin 04 9574456 admin 05 886799062 )并使用简单的for循环执行12次查询(每月一次)。

我的问题

我提出的解决方案可能不是最佳解决方案,因此我想知道是否可以通过一个查询完成此操作?

2 个答案:

答案 0 :(得分:2)

一个简单的聚合就可以了

SELECT
    username, MONTH(start), SUM(bytes_send+bytes_received)
FROM
    MyTable
WHERE
     -- avoiding the YEAR function on a predicate
    start >= '20130101' AND start < '20140101'
    AND
    username = 'admin'
GROUP BY
    username, MONTH(start)

答案 1 :(得分:0)

SELECT 
   username, TIMEDIFF(start,end), SUM(bytes_send + bytes_received)
FROM
   table
WHERE
   start>='20130101' AND start<'20140101'

这将给出用户名,两个日期之间的时差和字节总和。这是请求数据的最简单的查询。添加WHERE以进一步限制您获得的数据。