基于 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)的主要内容,如果未能解决你的问题,请参考以下文章

基于sql中的第三列返回两列的所有组合

基于 Spark DF 中 2 列的组合过滤行

组合 3 个表,其中 2 列的组合不是唯一的

基于List Python DataFrame中引用的字符串创建列占总数的百分比

如何将一列的运行总计添加到 Access 查询?

pandas基于组合逻辑筛选dataframe中两个数据列都满足条件的数据行(两个指定数据列的值都大于零的数据行)