在postgresql中创建视图时计算字段的麻烦

时间:2013-08-07 20:25:05

标签: postgresql

我在postgres数据库中有两个表q1dataq1lookupq1data包含3列(postidreasonidother),q1lookup包含2列(reasonidreason)。

我正在尝试创建一个包含4列(reasonidreasoncountpercentage)的视图。 count是每个reason的计数,percentage应该是每个count除以count(*) from q1data的总和(即reasonid的总行数)。

但它会出错并在count(*)附近说出语法错误。以下是我正在使用的代码。请帮忙。

select 
     cwfis_web.q1data.reasonid AS reasonid,
     cwfis_web.q1lookup.reason AS reason,
     count(cwfis_web.q1data.reasonid) AS count,
     round(
        (
            (
                count(cwfis_web.q1data.reasonid) 
                / 
                (select count(0) AS count(*) from cwfis_web.q1data)
            ) * 100
        )
     ,0) AS percentage 
from 
     cwfis_web.q1data 
join 
     cwfis_web.q1lookup 
     ON cwfis_web.q1data.reasonid = cwfis_web.q1lookup.reasonid 
group by 
     cwfis_web.q1data.reasonid;

2 个答案:

答案 0 :(得分:0)

尝试从

更改子查询
select count(0) AS count(*) from cwfis_web.q1data

select count(0) from cwfis_web.q1data

您还需要将cwfis_web.q1lookup.reason添加到group by

答案 1 :(得分:0)

首先,你有一个完全无效的句法:count(0) AS count(*)。用普通count(*)替换它,并为Group By添加缺少的reason条目,可以得到:

select 
     cwfis_web.q1data.reasonid AS reasonid,
     cwfis_web.q1lookup.reason AS reason,
     count(cwfis_web.q1data.reasonid) AS count,
     round(
        (
            (
                count(cwfis_web.q1data.reasonid) 
                / 
                (select count(*) from cwfis_web.q1data)
            ) * 100
        )
     ,0) AS percentage 
from 
     cwfis_web.q1data 
join 
     cwfis_web.q1lookup 
     ON cwfis_web.q1data.reasonid = cwfis_web.q1lookup.reasonid 
group by 
     cwfis_web.q1data.reasonid,
     cwfis_web.q1lookup.reason;

但是,as this live demo shows这不会为percentage提供正确的价值,因为count(cwfis_web.q1data.reasonid)(select count(*) from cwfis_web.q1data)都属于integer类型,因此整数除法执行,结果被截断为0

如果你将它们转换为numericthe 2-parameter round() function的预期参数类型,你会得到这个:

select 
     cwfis_web.q1data.reasonid AS reasonid,
     cwfis_web.q1lookup.reason AS reason,
     count(cwfis_web.q1data.reasonid) AS count,
     round(
        (
            (
                count(cwfis_web.q1data.reasonid)::numeric
                / 
                (select count(*) from cwfis_web.q1data)::numeric
            ) * 100
        )
     ,0) AS percentage 
from 
     cwfis_web.q1data 
join 
     cwfis_web.q1lookup 
     ON cwfis_web.q1data.reasonid = cwfis_web.q1lookup.reasonid 
group by 
     cwfis_web.q1data.reasonid,
     cwfis_web.q1lookup.reason;

其中this live demo显示的内容更像您希望的内容。 (或者,您可以转换为float,并将,0参数丢失为round()as in this demo。)