错误:列" drive.cs1_pdm_d_mini"必须出现在GROUP BY子句中或用于聚合函数

时间:2017-01-17 11:17:16

标签: sql postgresql

我需要在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!

2 个答案:

答案 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