Невозможно рассчитать медиану - SQL Server 2017 - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь определить среднее число транзакций в каждой категории. Несколько примечаний (так как набор данных ниже представляет собой небольшой фрагмент намного большего набора данных):

  • Сотрудник может принадлежать нескольким категориям
  • Медиана каждой транзакции должна быть> 0
  • Не каждый человек появляется в каждой категории

Данные настроены так:

|  Person | Category | Transaction |
|:-------:|:--------:|:-----------:|
| PersonA |   Sales  |      27     |
| PersonB |   Sales  |      75     |
| PersonC |   Sales  |      87     |
| PersonD |   Sales  |      36     |
| PersonE |   Sales  |      70     |
| PersonB |   Buys   |      60     |
| PersonC |   Buys   |      92     |
| PersonD |   Buys   |      39     |
| PersonA |    HR    |      59     |
| PersonB |    HR    |      53     |
| PersonC |    HR    |      98     |
| PersonD |    HR    |      54     |
| PersonE |    HR    |      70     |
| PersonA |   Other  |      46     |
| PersonC |   Other  |      66     |
| PersonD |   Other  |      76     |
| PersonB |   Other  |      2      |

Идеальный результат будет выглядеть так:

| Category | Median | Average |
|:--------:|:------:|:-------:|
|   Sales  |   70   |    59   |
|   Buys   |   60   |    64   |
|    HR    |   59   |    67   |
|   Other  |   56   |    48   |

Я могу получить среднее значение:

SELECT
    Category,
    AVG(Transaction) AS Average_Transactions
FROM
    table
GROUP BY
    Category

И это прекрасно работает!

Этот пост пытался помочь мне найти медиану. Я написал следующее:

SELECT
    Category,
    PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Transaction) OVER (PARTITION BY Category) AS Median_Transactions
FROM
    table
GROUP BY
    Category

Но я получаю сообщение об ошибке:

Msg 8120: Column 'Transactions' is invalid in the select list because it is not contained in either an aggregate function or the **GROUP BY** clause

Как это исправить?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Вы можете делать что хотите, используя SELECT DISTINCT:

SELECT DISTINCT Category,
       PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Transaction) OVER (PARTITION BY Category) AS Median_Transactions
FROM table;

К сожалению, SQL Сервер не предлагает функции PERCENTILE_ в качестве оконных функций и не имеет MEDIAN() функция агрегации. Вы также можете сделать это, используя подзапросы и количество.

0 голосов
/ 24 апреля 2020

Это не оптимально, но это ваше решение

SELECT DISTINCT
       category,
       PERCENTILE_DISC(0.5)WITHIN GROUP(ORDER BY val) OVER (PARTITION BY category) AS Median_Transactions,
       AVG(val) OVER (PARTITION BY d.category)  [AVG]
FROM #data d;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...