Вычислить процент по столбцу псевдонима

#php #mysql #sql

#php #mysql #sql

Вопрос:

Тип сервера: MariaDB Версия сервера: 10.4.16-MariaDB — mariadb.org версия протокола двоичного распространения: 10

Как мне рассчитать процент на основе значения столбца и псевдонима.

 SELECT REGION, PARTY, SUM(RESULT) AS 'TOTALVOTES',
(TOTALVOTES/SUM(TOTALVOTES)) * 100 AS 'SHARE'
FROM e_presidential
WHERE REGION = "ASHANTI"
GROUP BY PARTY
ORDER BY TOTALVOTES DESC;
 


Насколько я понимаю, я не могу сделать это с помощью столбца псевдонима.

Комментарии:

1. Какую версию MySQL вы используете?

2. Тип сервера: MariaDB Версия сервера: 10.4.16-MariaDB — mariadb.org версия протокола двоичного распространения: 10

3. Вам нужны проценты для каждой партии по регионам или только для каждой партии?

Ответ №1:

Используйте оконную функцию:

 SELECT REGION, PARTY, SUM(RESULT) AS TOTALVOTES,
       SUM(RESULT) * 100 / SUM(SUM(RESULT)) OVER () AS SHARE
FROM e_presidential
WHERE REGION = 'ASHANTI'
GROUP BY REGION, PARTY
ORDER BY TOTALVOTES DESC;
 

Обратите внимание, что я включил REGION в GROUP BY . Я удивлен, что ваш запрос не выдает ошибку, потому GROUP BY что столбцы несовместимы с неагрегированными SELECT столбцами.

Если бы вы хотели, чтобы это было для всех регионов, но общее количество внутри региона, тогда вы хотели бы PARTITION BY :

 SELECT REGION, PARTY, SUM(RESULT) AS TOTALVOTES,
       SUM(RESULT) * 100 / SUM(SUM(RESULT)) OVER (PARTITION BY REGION) AS SHARE
FROM e_presidential
GROUP BY REGION, PARTY
ORDER BY REGION, TOTALVOTES DESC;
 

Вот скрипка db<>, иллюстрирующая выполнение кода.

Ответ №2:

Вы не можете использовать псевдоним производного столбца в том же SELECT операторе для выполнения каких-либо вычислений.
Если вам нужен процент каждой стороны по регионам, используйте CTE, где вы вычисляете итоговые данные по каждому региону и присоединяетесь к вашему запросу:

 WITH cte AS (SELECT region, SUM(result) total_region FROM e_presidential GROUP BY region)
SELECT p.party, p.region,
       SUM(p.result) total_party,
       100 * SUM(p.result) / c.total_region share
FROM e_presidential p INNER JOIN cte c
ON c.region = p.region
GROUP BY party, region
 

Если вам нужен процент каждой стороны для всех регионов, используйте CTE, где вы вычисляете общее количество всех регионов и используете его в своем запросе:

 WITH cte AS (SELECT SUM(result) total FROM e_presidential)
SELECT party, 
       SUM(result) total_party,
       100 * SUM(result) / (SELECT total FROM cte) share
FROM e_presidential
GROUP BY party
 

Ответ №3:

Мы не можем использовать столбец псевдонима в вычислении, потому что он задан нами, и логически это не столбец. Это можно сделать с помощью

     SELECT REGION, PARTY, SUM(RESULT) AS 'TOTALVOTES',
(SUM(RESULT)/SUM(TOTALVOTES)) * 100 AS 'SHARE'
FROM e_presidential
WHERE REGION = "ASHANTI"
GROUP BY PARTY
ORDER BY TOTALVOTES DESC;
 

Это будет работать нормально

Комментарии:

1. это привело к той же ошибке, что и у меня. Неизвестный столбец ‘TOTALVOTES’ в ‘списке полей