#mysql #select #alias
Вопрос:
Мне нужно получить процент столбца псевдонима в моем запросе MYSQL.
У меня есть следующий запрос..
SELECT
datediff(crm_job.job_completed_date,crm_job.job_received_date ) as days_diff,
COUNT(*) as total_jobs
FROM
crm_customer
RIGHT JOIN crm_job
ON crm_customer.customer_id = crm_job.customer_id
LEFT JOIN crm_customer_account
ON crm_customer.customeraccount_id = crm_customer_account.customer_account_id
where account_description='EWC' and job_completed_date IS NOT NULL
GROUP BY days_diff
days_diff | всего_джобов |
---|---|
3 | 2 |
7 | 6 |
8 | 2 |
Мне нужно добавить еще один столбец с именем percentage_jobs справа от столбца total_jobs, в котором отображается процент от общего количества заданий. Под этим я подразумеваю, что percentage_jobs для верхней строки будет составлять 20%, вторая строка будет составлять 60%, а последняя строка также будет 20%.
Заранее спасибо.
С уважением
Алан
Ответ №1:
Если ваша версия MySQL 8.0 , вы можете использовать SUM()
функцию окна для нового столбца:
SELECT datediff(crm_job.job_completed_date,crm_job.job_received_date ) as days_diff,
COUNT(*) AS total_jobs,
100 * COUNT(*) / SUM(COUNT(*)) OVER () AS percentage_jobs
FROM ...
Комментарии:
1. Спасибо за ответ, очень ценю это. Хостинг — провайдер, с которым я работаю, не работает на MYSQL 8.0
Ответ №2:
Поместите свой запрос в CTE. Затем вы можете получить сумму total_jobs
и разделить на нее, чтобы получить процент.
WITH cte AS (
SELECT
datediff(crm_job.job_completed_date,crm_job.job_received_date ) as days_diff,
COUNT(*) as total_jobs
FROM
crm_customer
RIGHT JOIN crm_job
ON crm_customer.customer_id = crm_job.customer_id
LEFT JOIN crm_customer_account
ON crm_customer.customeraccount_id = crm_customer_account.customer_account_id
where account_description='EWC' and job_completed_date IS NOT NULL
GROUP BY days_diff
)
SELECT cte.*, ROUND(100 * total_jobs / total_total_jobs) AS percentage_jobs
FROM cte
CROSS JOIN (
SELECT SUM(cte.total_jobs) AS total_total_jobs
FROM cte
) AS t
CTE требует MySQL 8.x. Если вам нужно сделать это в более старой версии, определите подзапрос как представление.
CREATE OR REPLACE VIEW total_jobs AS
SELECT
datediff(crm_job.job_completed_date,crm_job.job_received_date ) as days_diff,
COUNT(*) as total_jobs
FROM
crm_customer
RIGHT JOIN crm_job
ON crm_customer.customer_id = crm_job.customer_id
LEFT JOIN crm_customer_account
ON crm_customer.customeraccount_id = crm_customer_account.customer_account_id
where account_description='EWC' and job_completed_date IS NOT NULL
GROUP BY days_diff;
SELECT tj.*, ROUND(100 * tj.total_jobs / ttj.total_total_jobs) AS percentage_jobs
FROM total_jobs AS tj
CROSS JOIN (
SELECT SUM(total_jobs) AS total_total_jobs
FROM total_jobs
) AS ttj
Комментарии:
1. Пожалуйста, простите мое невежество, но, поскольку хостинг-провайдер не работает на MYSQL 8.0, не могли бы вы посоветовать/расширить использование решения view. Все это для меня в новинку.
2.
CREATE VIEW cte AS ...
3. Большое вам спасибо , каждый день-это учебный день, так они говорят, и я узнал что-то новое. Ценю ваше время и усилия.