Php 计算别名列上的百分比
服务器类型:MariaDB服务器版本:10.4.16-MariaDB-MariaDB.org二进制分发协议版本:10 如何基于和别名列的值计算百分比Php 计算别名列上的百分比,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
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;
--
我收集到的信息是,我不能对别名列执行此操作。我们不能在计算中使用别名列,因为这是我们给出的,从逻辑上讲,它不是列。这可以通过
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;
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;
这将正常工作使用窗口功能:
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;
请注意,我将区域
包括在分组中。我很惊讶您的查询没有生成错误,因为groupby
列与未聚合的SELECT
列不一致
如果要对所有区域进行此操作,但不包括区域内的总数,则需要按分区进行:
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;
是说明代码运行的数据小提琴。您不能在同一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
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
如果要计算所有区域各方的百分比,请使用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
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
这产生了与我相同的错误。“字段列表”中的未知列“TOTALVOTES”您使用的是哪一版本的MySQL?服务器类型:MariaDB服务器版本:10.4.16-MariaDB-MariaDB.org二进制分发协议版本:10您希望按区域或仅针对每一方的百分比?您的代码甚至不运行。