我需要在Postgres做一个pourcentage,但它不起作用,请帮帮我
SELECT
(CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini) /
SUM(CS1_PDM_D_Mini) + SUM(CS2_PDM_D_Mini) + SUM(CS3_PDM_D_Mini)
AS My_CS_PDM_D_Mini
FROM mytable
我收到了以下错误:
column" drive.cs1_pdm_d_mini"必须出现在GROUP BY子句中或用于聚合函数
最后编辑:
嘿,伙计,非常感谢你的帮助,最后,我最终得到了这个:(COALESCE(sum(Drive.CS1_PDM_D_Mini),0)+COALESCE(sum(Drive.CS2_PDM_D_Mini),0)+COALESCE(sum(Drive.CS3_PDM_D_Mini),0)) /
CASE ((count(CS1_PDM_D_Mini) + count(CS2_PDM_D_Mini) + count(CS3_PDM_D_Mini)))
WHEN 0 THEN 1
ELSE
((count(CS1_PDM_D_Mini) + count(CS2_PDM_D_Mini) + count(CS3_PDM_D_Mini)))
END AS My_CS_PDM_D_Mini,
添加了一个用于管理除以零的CASE!
答案 0 :(得分:0)
请使用此
SELECT SUM(CS1_PDM_D_Mini) + SUM(CS2_PDM_D_Mini) + SUM(CS3_PDM_D_Mini) /
(CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini) AS My_CS_PDM_D_Mini
FROM mytable
group by CS1_PDM_D_Mini
,CS2_PDM_D_Mini
,CS3_PDM_D_Mini
答案 1 :(得分:0)
如果我是正确的,你试图计算出每行占总值的部分值,那么下面的查询就应该这样做。
SELECT
(CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini) /
(SUM(CS1_PDM_D_Mini) OVER () + SUM(CS2_PDM_D_Mini) OVER () + SUM(CS3_PDM_D_Mini) OVER ())
AS My_CS_PDM_D_Mini
FROM mytable
SUM(CS1_PDM_D_Mini) OVER ()
位使用Window表达式获取所有行的SUM,而不是仅查看当前行。
https://www.postgresql.org/docs/current/static/tutorial-window.html
中描述的窗口函数这将返回一个分数列表,例如:0.5为行的50%。所以你可能想要返回该行的密钥(如果有的话)。这可以添加到选择中 例如:
SELECT
meaningful_row_key,
(CS1_PDM_D_Mini + CS2_PDM_D_Mini + CS3_PDM_D_Mini) /
(SUM(CS1_PDM_D_Mini) OVER () + SUM(CS2_PDM_D_Mini) OVER () + SUM(CS3_PDM_D_Mini) OVER ())
AS My_CS_PDM_D_Mini
FROM mytable