Я изучил некоторые связанные вопросы, но я не мог найти помощь.
Я пытаюсь создать статистическую таблицу, которая показывает количество компаний, завершивших этапы регистрации. Я выполнил всю тяжелую работу, и я могу просто использовать простое утверждение select, чтобы увидеть, сколько выполнено, скажем, шаг 1. Но я хотел написать оператор select, который будет содержать step 1 step 2 step 3 (columns) with number (values)
компаний, завершивших каждый шаг.
step table
----------------------------------------------------
progress_id | label | level | score | is_completed |
----------------------------------------------------
progress_id: Компания, которую мы отслеживаем
метка: метка уровня шага, например: электронная почта компании была подтверждена,
уровень: скажи первый шаг,
оценка: например: 20%,
is_completed: true/false
Вы видите, с этим я могу просто сделать:
select count(*) step_one_count from step where level = 1 and is_completed = true
;
----------------
step_one_count |
----------------
20
select count(*) step_two_count from step where level = 2 and is_completed = true
;
----------------
step_two_count |
----------------
10
Затем мне нужно написать одно предложение выбора, будь то с подзапросом или что-то еще, чтобы получить этот результат ниже
----------------------------------------------------
step_one_count | step_two_count | step_three_count |
----------------------------------------------------
20 10 40
Я подозреваю, что вы хотите условное агрегирование, в MySQL
вы можете сделать:
SELECT SUM( (level = 1 and is_completed = true) ) AS step_one_count,
SUM( (level = 2 and is_completed = true) ) AS step_two_count,
SUM( (level = 3 and is_completed = true) ) AS step_three_count
FROM step s;
Стандартно вы можете использовать CASE
Expression вместо:
SELECT SUM(CASE WHEN level = 1 and is_completed = true THEN 1 ELSE 0 ) AS step_one_count,
. . .
FROM step s;
РЕДАКТИРОВАТЬ: Как вы пометили DBMS
вы можете использовать FILTER
:
SELECT COUNT(*) FILTER (WHERE level = 1 and is_completed = true) AS step_one_count,
COUNT(*) FILTER (WHERE level = 2 and is_completed = true) AS step_two_count,
COUNT(*) FILTER (WHERE level = 3 and is_completed = true) AS step_three_count,
FROM step s;
случай использования, когда
select
sum(case when level = 1 and is_completed = true then 1 else 0 end)
as step_one_count,
sum(case when level = 2 and is_completed = true then 1 else 0 end)
as step_two_count,
sum(case when level in (1,2) and is_completed = true then 1 else 0 end)
as step_three_count
from step
ERROR: function sum(boolean) does not exist LINE 1: select sum(level = 1 and is_completed = true) as step_one_co...