Select 基于范围的同一 table 的多个计数

Select Multiple counts from the same table based on range

您好,我有一个 ms 访问 table,格式如下

request_date        | Total_Uploaded
24/03/2015 07:42:47 |     36
24/03/2015 07:56:19 |     36
24/03/2015 08:17:28 |     4
24/03/2015 08:33:04 |     4
24/03/2015 08:39:07 |     36
24/03/2015 08:53:56 |     10
24/03/2015 09:04:26 |     16
24/03/2015 09:14:03 |     6
24/03/2015 09:14:05 |     16
24/03/2015 09:18:32 |     407
24/03/2015 09:18:34 |     16
24/03/2015 09:19:00 |     13
24/03/2015 09:19:05 |     62
24/03/2015 09:25:59 |     138
24/03/2015 09:27:08 |     138
24/03/2015 09:28:02 |     16
24/03/2015 09:31:09 |     16

我希望能够获取一组范围之间的每小时记录数。我的范围是

所以我想以 table 结束

DateTime |      0-10 Count| 22-50 Count| 51-100 Count | > 100 Count
24/03/2015 07        0    |      2     |     0        |     0   
24/03/2015 08        2    |      1     |     0        |     0 

我已经能够使用 datepart("h", request_date) 按日期分组并获得任何一个范围计数,但我希望我的查询能够完成所有他们一击。我试过子查询,但结果非常混乱,主要是错误的。感谢收到任何意见。

谢谢

您可以在每列的总和中使用 case。如果您将特定范围内的值转换为 1,将其他值转换为 0。

对每个子查询求和以获得每组的总计,然后按 date/hour

分组
SELECT request_date AS DateTime,  SUM(CASE WHEN Total_Uploaded BETWEEN 0 AND 10 
                               THEN 1 
                               ELSE 0 END) AS [0-10 Count],  
                      SUM(CASE WHEN Total_Uploaded BETWEEN 22 AND 50 
                               THEN 1 
                               ELSE 0 END) AS [22-50 Count],
                      SUM(CASE WHEN Total_Uploaded BETWEEN 51 AND 100 
                               THEN 1 
                               ELSE 0 END) AS [51-100 Count],
                      SUM(CASE WHEN Total_Uploaded > 100 
                               THEN 1 
                               ELSE 0 END) AS [> 100 Count]
FROM table
GROUP BY  CAST(request_date as date), DATEPART(hour,request_date)

因为这是 Access,方法如下:

SELECT 
    Format([request_date],"dd\/mm\/yyyy hh") AS DateHour, 
    Count(TableTotals.total_uploaded) AS Count_all, 
    Count(IIf([total_uploaded]<=10,1,Null)) AS Count_0_to_10, 
    Count(IIf([total_uploaded] Between 11 And 50,1,Null)) AS Count_11_to_50, 
    Count(IIf([total_uploaded] Between 51 And 100,1,Null)) AS Count_51_to_100, 
    Count(IIf([total_uploaded]>100,1,Null)) AS Count_101_up
FROM 
    TableTotals 
GROUP BY 
    DateValue([request_date]), 
    Hour([request_date]), 
    Format([request_date],"dd\/mm\/yyyy hh");

输出:

DateHour    Count_all   Count_0_to_10   Count_11_to_50  Count_51_to_100 Count_101_up
24/03/2015 07   2   0   2   0   0
24/03/2015 08   4   3   1   0   0
24/03/2015 09   11  1   6   1   3