2016-11-25 21 views
0

轉換單列爲多行被列我有一個表cash_drawer存儲量爲每天在一天結束貨幣的每種面值:在PostgreSQL

cash_drawer(
    date DATE, 
    100 SMALLINT, 
    50 SMALLINT, 
    20 SMALLINT, 
    10 SMALLINT, 
    5 SMALLINT, 
    1 SMALLINT 
) 

現在任何一天,我想將每個面額連成一排。

如果讓我們說了2016-11-25一天,如果我們有如下一行:

+------------+-------+------+------+------+-----+-----+ 
| date  | 100 | 50 | 20 | 10 | 5 | 1 | 
+------------+-------+------+------+------+-----+-----+ 
| 2016-11-25 | 5 | 12 | 27 | 43 | 147 | 129 | 
+------------+-------+------+------+------+-----+-----+ 

現在我希望讓出把查詢作爲:

+------------+--------+ 
|denomination|quantity| 
+------------+--------+ 
|100   |5  | 
+------------+--------+ 
|50   |12  | 
+------------+--------+ 
|20   |27  | 
+------------+--------+ 
|10   |43  | 
+------------+--------+ 
|5   |147  | 
+------------+--------+ 
|1   |129  | 
+------------+--------+ 

有沒有一種方法,通過這可能嗎?如果您有任何其他建議,請自由提出建議。

+0

檢查這一項。 http://stackoverflow.com/a/6360077/3470178 –

回答

2

使用json functions

select key as denomination, value as quantity 
from cash_drawer c, 
lateral json_each(row_to_json(c)) 
where key <> 'date' 
and date = '2016-11-25'; 

denomination | quantity 
--------------+---------- 
100   | 5 
50   | 12 
20   | 27 
10   | 43 
5   | 147 
1   | 129 
(6 rows) 

Test it here.

+0

但我怎麼選擇一個特定的'日期'? '從cash_drawer c'後面使用'WHERE'date'='2016-11-25''? – Blip

+0

當然,你可以自由地過濾'where'條款中的數據。見編輯的答案。 – klin