Как разделить друг с другом два запроса с разными условиями? - PullRequest
0 голосов
/ 06 февраля 2020

Есть таблица, в которой находятся столбцы менеджеров и столбец состояния. Как рассчитать общее состояние Fully, разделенное общее количество записей со всеми статусами, кроме N / A для каждого менеджера?

Я пытался изобразить таким образом, но из этого ничего не вышло

Первый запрос

SELECT "Manager Name", count("Performance Score") as Perfomance FROM public.hr_dataset  WHERE 
("Performance Score" = 'Fully Meets') GROUP BY "Manager Name"
ORDER BY Perfomance DESC;

Второй запрос

SELECT "Manager Name", count("Performance Score") FROM public.hr_dataset 
WHERE ("Performance Score" != 'N/A- too early to review') GROUP BY "Manager Name";

Необходимо получить два столбца с именем и значениями (1 запрос / 2 запроса)

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы можете выполнить условное агрегирование:

SELECT 
    "Manager Name", 
    COUNT(*) FILTER(WHERE "Performance Score" = 'Fully Meets') Perfomance_Fully_Meets,
    COUNT(*) Performance_Not_NA,
    AVG( ("Performance Score" = 'Fully Meets')::int) Performance_Ratio
FROM public.hr_dataset  
WHERE "Performance Score" != 'N/A- too early to review' 
GROUP BY "Manager Name"
ORDER BY Perfomance DESC;

Это работает следующим образом:

  • фильтр по статусам, отличным от 'N/A' (фактически включает статус 'Fully Meets')
  • агрегировать по имени менеджера
  • для каждого менеджера, сделать условный подсчет того, сколько записей имеет статус 'Fully Meets', отображаемых в столбце Perfomance_Fully_Meets
  • для каждого менеджера, подсчитать общее количество записей ('N/A' уже отфильтровано), в столбце Performance_Not_NA
  • , если вы хотите соотношение 'Fully Meets' записей, вы можете сделать это, используя AVG() в результате условия Performance Score" = 'Perfomance_Fully_Meets '; в числовом c контексте истинное условие оценивается как 1, а ложное - 0.
1 голос
/ 06 февраля 2020

Если я правильно понимаю, вы можете использовать FILTER для ограничения подсчитанных строк в соответствии с оценкой производительности.

SELECT "Manager Name",
       count(*) FILTER (WHERE "Performance Score" = 'Fully Meets')
       /
       count(*) FILTER (WHERE "Performance Score" <> 'N/A- too early to review')
       FROM public.hr_dataset
       GROUP BY "Manager Name";

Кстати, у вас там ужасные имена столбцов со всеми пробелами и пробелами и прочее ...

...