Получение процента столбца псевдонима в запросе MYSQL

#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. Большое вам спасибо , каждый день-это учебный день, так они говорят, и я узнал что-то новое. Ценю ваше время и усилия.