You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgresql如何基于两列组合为查询结果新增百分比列

PostgreSQL查询新增百分比列实现方案

最终修改后查询(最简写法)

SELECT 
  animaltype,
  size,
  SUM(total) AS Total,
  ROUND(
    SUM(total) * 100.0 / SUM(SUM(total)) OVER (PARTITION BY animaltype),
    2
  ) || '%' AS percentage
FROM animals
WHERE sponsored_animalid IS NULL
GROUP BY animaltype, size
ORDER BY 
  animaltype ASC,
  CASE size 
    WHEN 'small' THEN 1 
    WHEN 'medium' THEN 2 
    WHEN 'large' THEN 3 
  END ASC;

逻辑说明

  • 用PARTITION BY animaltype的窗口聚合函数,直接计算每个动物类型下所有size的总数量,无需额外创建表、视图或嵌套子查询
  • 计算百分比时乘以100.0避免整数除法丢失精度,通过ROUND函数保留两位小数,拼接%符号后直接输出符合要求的百分比格式
  • 排序部分修正了size的排序规则,通过CASE表达式自定义权重,严格按照small→medium→large的顺序输出,animaltype默认按字母升序排列

如果不需要百分比带%符号,只需要数值结果,删除语句中的|| '%'即可。

备选写法(逻辑更直观)

如果觉得嵌套聚合写法不易理解,可以用CTE先计算分组汇总结果再算百分比:

WITH group_stats AS (
  SELECT 
    animaltype,
    size,
    SUM(total) AS Total
  FROM animals
  WHERE sponsored_animalid IS NULL
  GROUP BY animaltype, size
)
SELECT 
  animaltype,
  size,
  Total,
  ROUND(Total * 100.0 / SUM(Total) OVER (PARTITION BY animaltype), 2) || '%' AS percentage
FROM group_stats
ORDER BY 
  animaltype ASC,
  CASE size 
    WHEN 'small' THEN 1 
    WHEN 'medium' THEN 2 
    WHEN 'large' THEN 3 
  END ASC;

内容的提问来源于stack exchange,提问作者ramsha chowdhrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:24:02