Оператор выбора SQL для суммирования итогов нескольких случаев и процента возврата? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть таблица для записей оценок сотрудников, которая связана с другой таблицей, в которой хранятся темы оценок, она имеет 3 типа оценок, таких как:

  1. Отрицательный и положительный (представлен в таблице как целочисленное значение)«-3, -2» соответственно).
  2. Нет & Да (представлено как целочисленное значение в таблице «-1, 0» соответственно).
  3. значение от 1 до 5 (представлено как целое числос тем же значением).

Итак, это пример схемы таблицы:

--------------------
| evaID      | int |
--------------------
| employeeID | int |
--------------------
| evaRec     | int |
--------------------

, а это пример данных таблицы:

-------------------------------
| evaID | employeeID | evaRec |
-------------------------------
| 1     | 00001      | -3     |
-------------------------------
| 17    | 00001      | -2     |
-------------------------------
| 19    | 00001      | -2     |
-------------------------------
| 19    | 00001      | -1     |
-------------------------------
| 16    | 00002      | 3      |
-------------------------------
| 16    | 00005      | 0      |
-------------------------------

Теперь я хочу выбрать сумму всех записей для конкретного сотрудника в процентах от оценок в соответствии с типами, но с разделением на 3 типа, например, для ex (не связанных с данными этой таблицы) :

  • Отрицательный и положительный тип: 20% / 80%
  • Нет и Да тип: 30% / 70%
  • 1,2,3,4 или 5введите: 10% / 50% / 5% / 15% / 20%

Поэтому в основном я хочу, чтобы оператор select возвращал6 значений с плавающей запятой представляют процент всех предыдущих упомянутых типов как (floatNegative, floatNo, float1, float2 float3 и float4) и, если возможно - , но я знаю, что это сложно, потому что я пока не могу понять логику, стоящую за ним - я хочу, чтобы он возвращал 7-е значение с плавающей запятой, представляющее процент для всех, как плохая, так и хорошая оценка, но я пока не могу понять, как смешать «Да или Нет», то есть 2-процентный процент, с «1,2,3,4 или 5 ", что составляет 5 факторов в процентах!

Так что позже в моем коде на c # я буду использовать результаты выбора, такие как:

  • floatNegative = 20 (Negative = 20% и положительный = 100-floatNegative = 80%)
  • floattNo = 30 (Нет = 30% и Да = 100-floatNo = 70%)
  • и т. д. с 5 другими числами...

Это означает, что у меня есть 3 отдельные группы расчетов процентов в соответствии с упомянутыми выше типами оценки.

Итак, наконец, если я выполню запрос к сотруднику "00001" из таблицы выше, яполучил бы результаты:

  • floatNegative = 33,3
  • floatPositive = 66,6
  • floatNo = 100,0

, потому что у него 1 x «отрицательная» запись (-3) и 2 x «положительных» записей (-2) , всего 3 записи.( в группе оценки «Отрицательный / Позитивный» ), а также у него есть 1 x «нет» записи (-1) , но нет «да»records (0) , поэтому результат равен 100% для "Нет" ( для группы оценки "Нет / Да" ).и меня не волнуют результаты других типов, если у него нет записей для него (например, 1,2,3,4,5), это может быть отрицательное значение с плавающей запятой, поэтому я могу выделить его в своем коде на c #, чтобы выяснить, чтоУ него еще нет записей по этим типам, и он скрывает текст индикатора процента в моей последней разметке asp.net.

1 Ответ

0 голосов
/ 28 февраля 2019

Я думаю, что вы ищете условное агрегирование .Логика состоит в том, чтобы GROUP BY employeeID, а затем использовать различные значения SUM(CASE ...) для вычисления промежуточных сумм.

Скажем, вы хотите подсчитать отрицательную оценку сотрудника, theu n:

SUM(CASE WHEN evaRec = -2 THEN 1 ELSE 0 END)

Вы также вычисляете общее количество положительных и отрицательных отзывов:

SUM(CASE WHEN evaRec IN (-2, -3) THEN 1 ELSE 0 END)

Вот полный запрос с использованием этих принципов.Для типа оценки двоичных файлов (положительный / отрицательный, да / нет) вычисляется только одно из двух значений (другое - просто 1 - <this_value>).Для типов 1/2/3/4/5 каждая пропорция вычисляется индивидуально.

SELECT
    employeeID,
    1.0 * SUM(CASE WHEN evaRec = -2 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (-2, -3) THEN 1 ELSE 0 END), 0) PercentPositive,
    1.0 * SUM(CASE WHEN evaRec =  0 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (-1, 0)  THEN 1 ELSE 0 END), 0) PercentYes,
    1.0 * SUM(CASE WHEN evaRec =  1 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5)  THEN 1 ELSE 0 END), 0) PercentValue1,
    1.0 * SUM(CASE WHEN evaRec =  2 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5)  THEN 1 ELSE 0 END), 0) PercentValue2,
    1.0 * SUM(CASE WHEN evaRec =  3 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5)  THEN 1 ELSE 0 END), 0) PercentValue3,
    1.0 * SUM(CASE WHEN evaRec =  4 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5)  THEN 1 ELSE 0 END), 0) PercentValue4,
    1.0 * SUM(CASE WHEN evaRec =  5 THEN 1 ELSE 0 END) / NULLIF(SUM(CASE WHEN evaRec IN (1, 2, 3, 4, 5)  THEN 1 ELSE 0 END), 0) PercentValue5
FROM t
GROUP BY employeeID

Примечание: необходимо соблюдать особую осторожность, чтобы избежать деления на 0.

Это DB Fiddle с вашими примерами возвращает:

employeeID | PercentPositive | PercentYes     | PercentValue1  | PercentValue2  | PercentValue3  | PercentValue4  | PercentValue5 
---------: | :-------------- | :------------- | :------------- | :------------- | :------------- | :------------- | :-------------
         1 | 0.666666666666  | 0.000000000000 | <em>null</em>           | <em>null</em>           | <em>null</em>           | <em>null</em>           | <em>null</em>          
         2 | <em>null</em>            | <em>null</em>           | 0.000000000000 | 0.000000000000 | 1.000000000000 | 0.000000000000 | 0.000000000000
         5 | <em>null</em>            | 1.000000000000 | <em>null</em>           | <em>null</em>           | <em>null</em>           | <em>null</em>           | <em>null</em>          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...