Как создать запрос к SQL-серверу - PullRequest
0 голосов
/ 07 мая 2019

У меня есть следующая таблица в 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 голосов
/ 07 мая 2019

Ниже приведен единый список, в котором указана страна, т. Е. Она не превращает каждую страну в столбец.Чтобы создать каждый столбец, вы должны либо сделать то, что сделал Sticky-Bit, либо вы должны pivot - в любом случае вам придется обрабатывать каждую страну индивидуально (если вы не строите pivot с использованием динамического SQL).Но, может быть, вы можете использовать этот список вместо того, чтобы нуждаться в отдельном столбце?

declare @MyTable table ([Date] date, Browser varchar(32), Country varchar(2), [Time] int)

insert into @MyTable ([Date], Browser, Country, [Time])
  select '2019-05-06',      'Chrome',          'US',              1000
  union all select '2019-05-06',      'Chrome',          'US',              560
  union all select '2019-05-07',      'Firefox',         'JP',              2300
  union all select '2019-05-07',      'Edge',            'US',              1200
  union all select '2019-05-07',      'Chrome',          'JP',              3000
  union all select '2019-05-07',      'Chrome',          'JP',              3200
  union all select '2019-05-07',      'Chrome',          'JP',              2100
  union all select '2019-05-07',      'Firefox',         'US',              2200

select Duration, Country, count(*)
from (
  select *
    , CASE WHEN [Time] >= 0 AND [Time] < 1000 THEN '0 - 1s'
    WHEN [Time] >= 1000 AND [Time] < 2000 THEN '1 - 2s'
    WHEN [Time] >= 2000 AND [Time] < 3000 THEN '2 - 3s'
    ELSE '+3s' END Duration
    , CASE WHEN [Time] >= 0 AND [Time] < 1000 THEN 0
    WHEN [Time] >= 1000 AND [Time] < 2000 THEN 1
    WHEN [Time] >= 2000 AND [Time] < 3000 THEN 2
    ELSE 3 END DurationOrder
  from @MyTable
) X
group by Duration, DurationOrder, Country
order by DurationOrder, Country
0 голосов
/ 07 мая 2019

С условной агрегацией вы уже были на правильном пути для одного возможного решения. Но есть условие по стране. В 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...