SQL запрос с использованием функций Sum () и count () - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь выполнить запрос в PostgresQL с помощью функции SUM, чтобы получить всего 3 различных типа строк (Root, Dynami c, Test). Я использовал функцию Sum () для первой попытки и функцию Count () для второй попытки; К сожалению, оба не работали. Я ожидаю синтаксической ошибки (поскольку я новичок в использовании SQL), но не уверен, что это такое и как ее исправить!

1-я попытка с функцией Sum ():

SELECT 
sum(case when "exerciseType" = 'ROOT') as total_root_exercises, 
sum(case when "exerciseType" = 'DYNAMIC') as total_dynamic_exercises,
sum(case when "exerciseType" = 'TEST') as total_test_exercises
FROM exer 
GROUP BY "exerciseType"

2-я попытка с функцией Count ():

select 
count(*) as total_root_exercises
where "exerciseType" = 'ROOT',
count(*) as total_Dynamic_exercises
where "exerciseType" in('DYNAMIC'),
count(*) as total_test_exercises
where "exerciseType" in('TEST')
FROM exer

Могу я получить помощь с этим? Спасибо :)

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Рассмотрите возможность использования синтаксиса filter для агрегирования функций, который является стандартным SQL и который Postgres поддерживает:

select 
    count(*) filter(where "exerciseType" = 'ROOT'   ) as total_root_exercises,
    count(*) filter(where "exerciseType" = 'DYNAMIC') as total_Dynamic_exercises,
    count(*) filter(where "exerciseType" = 'TEST'   ) as total_test_exercises 
FROM exer

Если бы вы писали это без синтаксиса filter (как при первой попытке) переносимый синтаксис:

select 
    sum(case when "exerciseType" = 'ROOT'    then 1 else 0 end) as total_root_exercises,
    sum(case when "exerciseType" = 'DYNAMIC' then 1 else 0 end) as total_Dynamic_exercises,
    sum(case when "exerciseType" = 'TEST'    then 1 else 0 end) as total_test_exercises 
FROM exer
1 голос
/ 05 августа 2020

Вы можете использовать filter для условной агрегации:

SELECT count(*) filter (where "exerciseType" = 'ROOT') as total_root_exercises, 
       count(*) filter (where "exerciseType" = 'DYNAMIC') as total_dynamic_exercises,
       count(*) filter (where "exerciseType" = 'TEST') as total_test_exercises
FROM exer ;

Вам не нужна внешняя агрегация, хотя вы можете проще возвращать результаты в строках, а не в столбцах:

select "exerciseType", count(*)
from exer
group by "exerciseType";

Примечание: я настоятельно не рекомендую использовать экранированные имена столбцов. Не используйте двойные кавычки при определении таблиц и не используйте их в своих запросах.

...