如何存储SQL Server查询

时间:2019-05-06 21:25:33

标签: sql-server grouping

我在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

我应该如何解决这个问题?

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