2016-08-10 65 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」中的順序排列。 –