2016-11-29 68 views
0

以下查询使用子查询来计算加权值。我收到的问题是一个除0错误的随机发生的真0值聚合以及从子查询可能的> 0聚合返回。Postgresql查询结果除以0在使用大小写检查后0

SELECT 
    table1.id, 
    SUM(subquery1.total_value_1), 
    CASE 
    WHEN SUM(subquery1.total_value_1) = 0 THEN 0 
    ELSE ROUND(SUM(percentage_value * (table1.value_1 /subquery1.total_value_1 ::FLOAT)) ::NUMERIC,2) 
    END AS percentage_value 
FROM 
    table1, 
    (SELECT 
     id, 
     SUM(value_1) AS total_value_1 
    FROM 
     table1 
    WHERE 
     report_time BETWEEN '2016-10-28 00:00' AND '2016-10-29 23:59' 
    GROUP BY 
     id 
    ) subquery1 
WHERE 
    table1.id = subquery1.id 
    AND report_time BETWEEN '2016-10-28 00:00' AND '2016-10-29 23:59' 
    AND table1.id = 12572 
GROUP BY 
    table1.id 
ORDER BY 
    table1.id 

在某些情况下,CASE语句是还在做师的评估,尽管subquery1.total_value_1是0。只是要注意的价值,也没有可能性subquery1.total_value_1为NULL,作为表如果未定义添加的值,则在插入时将该值默认为0。

+0

然而,如果你把'table1.value_1/subquery1.total_value_1 :: FLOAT'改成'table1.value_1 /最大(0.00000000001,subquery1.total_value_1 :: FLOAT)' - 会发生什么?.. –

+0

你确定你需要嵌套选择吗? – McNets

+0

你能告诉我们table1的模式吗? – McNets

回答

0

在下面的例子,总和(列)是1对两行,而列是等于零或一个:

a=# with v as (
    select generate_series(0,1,1) al 
) 
select sum(v.al) over(),v.al 
from v; 
sum | al 
-----+---- 
    1 | 0 
    1 | 1 
(2 rows) 

所以在SUM(subquery1.total_value_1) = 0可以是不等于零,但subquery1.total_value_1 ::FLOAT将是,这样你得到division by zero