2017-05-08 19 views
1

我正在尋找一種方法來動態地或自動地在下面的case語句中命名列。情景 - 我試圖找出每個國家有多少個不同行業的公司。這些國家是行,而類別是列。postgresql在case語句中動態命名列

我使用PostgreSQL的支點這樣就不會工作,我沒有足夠的新版本,我可以使用交叉表

我希望能夠複製此爲更大的場景中我不必擔心像我在這裏那樣對cat_nbr和列名進行「硬編碼」。

SELECT country, 
     count(CASE WHEN cat_nbr = 1 THEN company_code END) retail, 
     count(CASE WHEN cat_nbr = 2 THEN company_code END) finance, 
     count(CASE WHEN cat_nbr = 3 THEN company_code END) oil, 
     count(CASE WHEN cat_nbr = 4 THEN company_code END) tech 
FROM global_companies 
GROUP BY country 

的情況下,它是不明確的表結構形式有以下欄目:

country - cat_nbr - company_code - cat_desc.  

Cat_desc是我已經硬編碼了的話「零售」,「金融」等

有什麼我可以做到這一點與我指的是每個cat_nbr/cat_desc什麼少硬編碼?有很多很多的cat_nbrs和cat_descs。

+0

Postgresql版本?你有一張桌子cat_nbr? –

+1

您需要創建一個函數並創建一個類似於[this]的動態查詢(http://stackoverflow.com/questions/20965882/for-loop-with-dynamic-table-name-in-postgresql-9-1)但是,你會在你的分類表之間循環。 –

+0

@JuanCarlosOropeza。 Cat_nbr和零售/財務齊頭並進。例如,類別#1 =零售,#2 =金融等。將語言轉化爲正在發生的事情。版本是在7s的東西,不能確切atm。 – runningbirds

回答

0

而不是硬編碼類別名稱,您可以硬編碼列的國家名稱,並讓行像往常一樣動態。

SELECT cat_nbr, 
     COUNT(CASE WHEN Country = 'US' THEN company_code END) AS NumUS, 
     COUNT(CASE WHEN Country = 'UK' THEN company_code END) AS NumUK, 
     COUNT(CASE WHEN Country = 'FR' THEN company_code END) AS NumFR, 
     ... 
FROM global_companies 
GROUP BY cat_nbr; 

另一種選擇是你可以將數據聚合成JSON或數組結構。