我在SQL Server中具有下表:
Date Browser Country Time(ms)
----------------------------------------------------------
2019-05-06 Chrome US 1000
2019-05-06 Chrome US 560
2019-05-07 Firefox JP 2300
2019-05-07 Edge US 1200
2019-05-07 Chrome JP 3000
2019-05-07 Chrome JP 3200
2019-05-07 Chrome JP 2100
2019-05-07 Firefox US 2200
我需要根据完成时间将结果“分类”。最终结果将是这样的:
Time(ms) US JP
--------------------------------------
0-1s 2 0
1-2s 1 0
2-3s 1 2
3+s 0 2
我最能做的就是这样的查询:
SELECT
[Country],
COUNT(CASE WHEN [Time] >= 0 AND [Time] < 1000 THEN 1 END) AS '0 - 1s',
COUNT(CASE WHEN [Time] >= 1000 AND [Time] < 2000 THEN 1 END) AS '1 - 2s',
COUNT(CASE WHEN [Time] >= 2000 AND [Time] < 3000 THEN 1 END) AS '2 - 3s',
COUNT(CASE WHEN [Time] >= 3000 THEN 1 END) AS '+3s'
FROM [dbo].[MyTable]
GROUP BY [Country]
但是由于我的结果是:
Country 0 - 1s 1 - 2s 2 - 3s +3s
---------------------------------------------------------
US 2 1 1 0
JA 0 0 2 2
我应该如何解决这个问题?
答案 0 :(得分:0)
使用条件聚合,您已经在正确的轨道上寻求一种可能的解决方案。但是对国家有条件。在持续时间的WHERE
过滤器中,并将不同的持续时间与UNION ALL
粘贴在一起。
SELECT '0 - 1s' [Time(ms)],
count(CASE
WHEN [Country] = 'US' THEN
1
END) [US],
count(CASE
WHEN [Country] = 'JP' THEN
1
END) [JP]
FROM [dbo].[mytable]
WHERE [Time] >= 0
AND [Time] < 1000
UNION ALL
...
UNION ALL
SELECT '+3s' [Time(ms)],
count(CASE
WHEN [Country] = 'US' THEN
1
END) [US],
count(CASE
WHEN [Country] = 'JP' THEN
1
END) [JP]
FROM [dbo].[mytable]
WHERE [Time] >= 3000;
答案 1 :(得分:0)
以下内容将为您提供一个包含国家/地区的列表,即不会使每个国家/地区都成为一列。要使每列成为一列,您要么必须完成Sticky-Bit所做的工作,要么必须[nodemon] app crashed - waiting for file changes before starting...
–无论哪种方式,您都必须分别处理每个国家/地区(除非您使用动态SQL构建pivot
) 。但是也许您最终用户可以使用此列表,而不需要单独的列?
pivot