PostgreSQL 使用多列来计算百分比的数字
PostgreSQL Using multiple columns to calculate numbers for a percentage
我是 SQL 的新手,我一直在努力解决一个非常基本的问题。我尝试通过几种不同的方式来解决这个问题,但到目前为止没有任何效果。
所以在我的 table 旅游数据中,我有 4 列:transportType、month、year 和 count。示例:
Month Year Transport Type Count
Nov 1992 Car 100
Nov 1992 Plane 250
Dec 1992 Car 200
Dec 1992 Plane 250
Jan 1993 Car 200
Jan 1993 Plane 200
除了我实际上有四种不同的运输类型以及更多的月份和年份。
我想计算多年来使用的每种交通工具的百分比。所以我想要的输出是这样的:
Year Transport Type Percentage
1992 Car 37.5%
1992 Plane 62.5%
1993 Car 50%
1993 Plane 50%
我当前的代码如下所示:
WITH t1 as(
select transport, SUM(ncount) AS transportTotal
from touristdata
GROUP BY transport)
SELECT years, touristdata.transport, ROUND(100.0 *(transportTotal/SUM(ncount)))
FROM touristdata, t1
GROUP BY years;
在这种形式下我得到错误:
ERROR: column "touristdata.transport" must appear in the GROUP BY clause or be used in an aggregate function
LINE 5: SELECT years, touristdata.transport, ROUND(100.0 *(transpor...
但我知道在 GROUP BY 中添加 touristdata.transport 和 transportTotal 也不起作用。我试了试以确保每年每种运输类型都有 4 个条目。
我之前没有final 'GROUP BY years',我试着用子查询来做,但我想不通。
如果有人能帮助我解决这个问题,我将不胜感激!
您可以使用 window 函数执行此操作:
SELECT td.years, td.transport, SUM(ncount),
SUM(ncount) / SUM( 1.0*SUM(ncount) ) OVER (PARTITION BY year) as ratio
FROM touristdata td
GROUP BY td.years, td.transport;
我是 SQL 的新手,我一直在努力解决一个非常基本的问题。我尝试通过几种不同的方式来解决这个问题,但到目前为止没有任何效果。
所以在我的 table 旅游数据中,我有 4 列:transportType、month、year 和 count。示例:
Month Year Transport Type Count
Nov 1992 Car 100
Nov 1992 Plane 250
Dec 1992 Car 200
Dec 1992 Plane 250
Jan 1993 Car 200
Jan 1993 Plane 200
除了我实际上有四种不同的运输类型以及更多的月份和年份。
我想计算多年来使用的每种交通工具的百分比。所以我想要的输出是这样的:
Year Transport Type Percentage
1992 Car 37.5%
1992 Plane 62.5%
1993 Car 50%
1993 Plane 50%
我当前的代码如下所示:
WITH t1 as(
select transport, SUM(ncount) AS transportTotal
from touristdata
GROUP BY transport)
SELECT years, touristdata.transport, ROUND(100.0 *(transportTotal/SUM(ncount)))
FROM touristdata, t1
GROUP BY years;
在这种形式下我得到错误:
ERROR: column "touristdata.transport" must appear in the GROUP BY clause or be used in an aggregate function
LINE 5: SELECT years, touristdata.transport, ROUND(100.0 *(transpor...
但我知道在 GROUP BY 中添加 touristdata.transport 和 transportTotal 也不起作用。我试了试以确保每年每种运输类型都有 4 个条目。
我之前没有final 'GROUP BY years',我试着用子查询来做,但我想不通。
如果有人能帮助我解决这个问题,我将不胜感激!
您可以使用 window 函数执行此操作:
SELECT td.years, td.transport, SUM(ncount),
SUM(ncount) / SUM( 1.0*SUM(ncount) ) OVER (PARTITION BY year) as ratio
FROM touristdata td
GROUP BY td.years, td.transport;