#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’ в ‘списке полей