我在postgres数据库中有两个表q1data
和q1lookup
。 q1data
包含3列(postid
,reasonid
,other
),q1lookup
包含2列(reasonid
,reason
)。
我正在尝试创建一个包含4列(reasonid
,reason
,count
,percentage
)的视图。 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;
答案 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
。
如果你将它们转换为numeric
(the 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。)