PostgreSQL使用多列来计算百分比的数字

时间:2017-03-22 15:57:21

标签: sql postgresql group-by percentage

我是SQL的新手,我一直在努力解决一个非常基本的问题。我试图通过几种不同的方式来实现,但到目前为止还没有任何工作。

所以在我的表touristdata中我有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...

但我知道将touristdata.transport和transportTotal添加到GROUP BY也不会有效。我试过这个以确保每年每种传输类型最终有4个条目。

我之前没有最后的'GROUP BY年',我尝试用子查询来做,但我无法理解。

如果有人能帮助我解决这个问题,我真的很感激!

1 个答案:

答案 0 :(得分:0)

您可以使用窗口功能执行此操作:

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;