2016-08-10 38 views
0

我试图使用postgresql来总结一些数据,并且需要生成一个频率列,然后转置另一个列,其中包含频率结果。SQL转置列,以独特组合的频率作为新值

例如 我的出发表是这样的:

Month | Nationality | Car 
Oct-15 | GBR   | Rover 
Sep-15 | FRA   | Fiat 
Oct-15 | GBR   | Rover 
Sep-15 | TUR   | Fiat 

我想让它计算其他列的每个唯一组合的频率的新列。因此,它想是这样的:

Month | Nationality | Car | FREQ 
Oct-15 | GBR   | Rover | 2 
Sep-15 | FRA   | Fiat | 1 
Sep-15 | TUR   | Fiat | 1 

然后,我要转的月柱,在本月的每个值创建新列,并使用频率计数为这些列中的值填充:

Nationality | Car | Sep-15 | Oct-15 
GBR   | Rover | 0  | 2 
FRA   | Fiat | 1  | 0 
TUR   | Fiat | 1  | 0 

我一直在寻找转置查询和转置的交叉表功能,但无法弄清楚如何使用唯一组合的频率作为值。

由于

回答

1

一种方法是使用聚合条件:

select nationality, car, 
     sum(case when month = 'Sep-15' then 1 else 0 end) as "Sep-15", 
     sum(case when month = 'Oct-15' then 1 else 0 end) as "Oct-15" 
from t 
group by nationality, car; 

该制剂假定month被存储为一个字符串,而不是一个日期。

Postgres确实为此提供了其他功能,例如crosstab。但是,这似乎是你的情况最简单的方法。

+0

谢谢,该解决方案看起来不错。但是,我真的很希望新的列以日期顺序出现,因此9月15日将在10月15日之前出现,以此类推。如果我将月份列存储为字符串,它们是否会按字母顺序显示? – rw2

+0

@ rw2。 。 。列按照它们出现在“SELECT”中的顺序排列。 –