基于 2 列的组合添加百分比列(Postgresql)
Posted
技术标签:
【中文标题】基于 2 列的组合添加百分比列(Postgresql)【英文标题】:Adding Percent Column Based on Combination of 2 columns (Postgresql) 【发布时间】:2021-12-23 08:26:18 【问题描述】:我在查询时遇到问题,希望得到您的反馈。
我需要添加一个“百分比”列(四舍五入到小数点后 2 位),用于计算每种动物类型和大小组合的总数百分比。
这些是从动物表中选择的列:
动物类型(按字母顺序排序) 尺寸(排序顺序:小、中、大) 总计这是我的摘要查询代码:
SELECT animaltype, size, SUM(total) AS Total FROM animals
WHERE sponsored_animalid IS NULL
GROUP BY animaltype, size
ORDER BY animaltype, size DESC;
示例输出应如下所示:
需要为每种动物类型和大小组合计算百分比。示例公式例如(动物类型:鸟,大小:小):
ROUND((Total for Bird(Small) / SUM of total for all parents (small, medium, large) * 100) , 2) = 12.55%(参考上面的示例输出)
我不想创建新的表/视图,只需要一种方法来修复查询输出的百分比列。
感谢您的帮助。
如果有人可以帮我计算动物类型和大小组合的百分比,请不胜感激。
【问题讨论】:
使用此代码有助于计算列总数的百分比,但它无助于计算每个动物和大小组合的百分比,如示例输出表代码所示:SELECT animaltype, size, SUM(total) AS total , ROUND(( SUM(total) * 100 / SUM( SUM(total)) OVER ()),2) 来自动物的百分比 WHERE spired_animalid 为 NULL GROUP BY 动物类型,大小 ORDER BY 动物类型,大小 DESC;感谢一些反馈。谢谢! 欢迎来到 SO 社区。请花几分钟时间拨打Tour 并查看How to Ask。特别是发布表定义 (ddl) 和示例数据,作为文本 - 无图像,甚至更好地创建 fiddle 以及该数据的预期结果。 【参考方案1】:我建议你这个查询:
SELECT
t1.animaltype,
t1.size,
SUM(t1.total) AS total,
round(SUM(t1.total / t2.total) * 100, 2) percent
FROM
animals t1
INNER JOIN (
SELECT
animaltype,
SUM(total) total
FROM
animals
GROUP BY
animaltype
) t2 ON t1.animaltype = t2.animaltype
WHERE
t1.sponsored_animalid IS NULL
GROUP BY
t1.animaltype,
t1.size
ORDER BY
t1.animaltype,
t1.size DESC;
【讨论】:
您好,上面的代码显示百分比列将为零值【参考方案2】:您可以使用窗口函数来计算此值。例如:
SELECT
animaltype,
size,
SUM(total) AS Total,
100.0 * SUM(total) / SUM(total) OVER(partition by animaltype) AS percent
FROM animals
WHERE sponsored_animalid IS NULL
GROUP BY animaltype, size
ORDER BY animaltype, size DESC;
【讨论】:
嘿,我在上面的代码中收到此错误: (psycopg2.errors.GroupingError) 列“animals.total”必须出现在 GROUP BY 子句中或用于聚合函数第 5 行:100.0 * SUM(total) / SUM(total) OVER(按动物划分)以上是关于基于 2 列的组合添加百分比列(Postgresql)的主要内容,如果未能解决你的问题,请参考以下文章