2016-11-25 1 views
0

J'ai une table cash_drawer qui stocke quantité pour chaque valeur de la monnaie pour chaque jour à la fin de la journée:Convertir une seule ligne en plusieurs lignes par les colonnes Postgresql

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

Maintenant un jour donné, je souhaite obtenir chaque dénomination comme une rangée.

Si permet de dire pour le jour 2016-11-25, si nous avons la ligne suivante:

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

Maintenant, je veux faire le eteint de la requête comme:

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

Y at-il une méthode ce qui est possible? Si vous avez d'autres suggestions, n'hésitez pas à suggérer.

+0

vérifier celui-ci. http://stackoverflow.com/a/6360077/3470178 –

Répondre

2

Utilisation 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

mais comment puis-je sélectionner pour un 'date' spécifique? est-ce que j'utilise 'WHERE" date "= '2016-11-25'' après' de cash_drawer c'? – Blip

+0

Bien sûr, vous pouvez filtrer librement les données dans la clause 'where'. Voir la réponse éditée. – klin