SQL Server: выбор диапазона значений из таблицы и расчет по ним - PullRequest
0 голосов
/ 09 января 2019

У меня есть эта таблица

enter image description here

, который имеет 3 столбца

Machine Name | memory | date

Я бы хотел:

  1. Выберите среднее из этих значений памяти, если значения памяти находятся в определенных диапазонах
  2. Я хочу знать, как часто он попадает в этот диапазон

Вот мой треск, но это:

SELECT
    MachineName, 
    CASE 
       WHEN Memory >= 75 AND Memory < 85 
          THEN AVG(Memory) AS Memory75to85,
               COUNT((MachineName)) AS Frequency75to85,
       WHEN Memory >= 85 AND Memory < 95 
          THEN AVG(Memory) AS Memory85to95,
               COUNT((MachineName)) AS Frequency85to95 
       WHEN Memory >= 95 AND Memory <= 100
          THEN AVG(Memory) AS Memory95to100,
               COUNT((MachineName)) AS Frequency95to100
       ELSE
          0, CounterDateTime
    END
FROM 
    Table
GROUP BY 
    MachineName

Но, похоже, это не работает. Результат столбца, который я хочу:

| Name | Memory75to85 | Frequency75to85 | Memory85to95 | Frequency85to95 | Memory95to100 | Frequency95to100 | date |

Кто-нибудь хочет помочь?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете попробовать использовать условное агрегирование, как показано ниже -

Select  
   MachineName, 
   avg(CASE WHEN Memory >=75 AND Memory <85 THEN Memory end) AS Memory75to85,
   count(CASE WHEN Memory >=75 AND Memory <85 THEN MachineName end) AS Frequency75to85,
   avg(case when Memory >=85 AND Memory <95 THEN Memory end) AS Memory85to95,
   count(case when Memory >=85 AND Memory <95 THEN MachineName end) AS Frequency85to95 
   avg(case WHEN Memory >=95 AND Memory <=100 THEN Memory end) AS Memory95to100,
   count(case WHEN Memory >=95 AND Memory <=100 THEN MachineName end) AS Frequency95to100,
   cast(CounterDateTime as date) as Date
From Table
Group by MachineName,cast(CounterDateTime as date)
0 голосов
/ 09 января 2019

Я думаю, что вы хотите использовать здесь условное агрегирование:

SELECT
    MachineName,
    CounterDateTime,
    AVG(CASE WHEN Memory >= 75 AND Memory < 85 THEN Memory END) AS Memory75to85,
    COUNT(CASE WHEN Memory >= 75 AND Memory < 85 THEN 1 END) AS Frequency75to85,
    AVG(CASE WHEN Memory >= 85 AND Memory < 95 THEN Memory END) AS Memory85to95,
    COUNT(CASE WHEN Memory >= 85 AND Memory < 95 THEN 1 END) AS Frequency85to95,
    AVG(CASE WHEN Memory >= 95 AND Memory <= 100 THEN Memory END) AS Memory95to100,
    COUNT(CASE WHEN Memory >= 95 AND Memory <= 100 THEN 1 END) AS Frequency95to100
FROM yourTable
GROUP BY
    MachineName,
    CounterDateTime;

Одной из основных проблем вашего текущего подхода является то, что выражение CASE должно генерировать одно скалярное значение; он не может вывести два разных значения. Таким образом, в приведенном выше запросе мы используем условные средние значения и числа на основе диапазона памяти, чтобы сгенерировать желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...