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
我希望能够获取一组范围之间的每小时记录数。我的范围是
- 0 - 10
- 11 - 50
- 51 - 100
- > 101
所以我想以 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
您好,我有一个 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
我希望能够获取一组范围之间的每小时记录数。我的范围是
- 0 - 10
- 11 - 50
- 51 - 100
- > 101
所以我想以 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