将数据转换为表格表示

时间:2018-10-16 20:23:07

标签: postgresql transpose

我想在PostgreSQL中转置以下数据。

第2列-代表表格ref,第3列代表表格单元格ref,第4列代表表格行,第5列代表值。

所需的输出为

p_164 2017 2018
p_164  £ £
p_164 6,819,277 6,292,030
etc.

行数(第4列)是可变的

源数据

1803147 p_164   42955214    0    2017
1803147 p_164   42955215    0    2016
1803147 p_164   42955216    1   £
1803147 p_164   42955217    1    £
1803147 p_164   42955218    2   6,819,277
1803147 p_164   42955219    2    6,292,030
1803147 p_164   42955220    3   (395,131)
1803147 p_164   42955221    3    (509,444)
1803147 p_164   42955222    4   6,424,146
1803147 p_164   42955223    4    5,782,586
1803147 p_164   42955224    5   (5,841,975)
1803147 p_164   42955225    5    (5,433,515)
1803147 p_164   42955226    6   582,171
1803147 p_164   42955227    6    349,071
1803147 p_164   42955228    7   -
1803147 p_164   42955229    7    6
1803147 p_164   42955230    8   (25,346)
1803147 p_164   42955231    8    (38,773)
1803147 p_164   42955232    9   556,825
1803147 p_164   42955233    9    . 310,304
1803147 p_164   42955234    10  40,962
1803147 p_164   42955235    10   49,704
1803147 p_164   42955236    11  597,787
1803147 p_164   42955237    11   360,008
1803147 p_164   42955238    12  597,787
1803147 p_164   42955239    13  597,787
1803147 p_164   42955240    13   360,008
1803147 p_164   42955241    14  (47,412)
1803147 p_164   42955242    14   (796)
1803147 p_164   42955243    15  645,199
1803147 p_164   42955244    15   360,804
1803147 p_164   42955245    16  597,787
1803147 p_164   42955246    16   360,008
1803147 p_164   42955247    17  (47,412)
1803147 p_164   42955248    17   (796)
1803147 p_164   42955249    18  645,199
1803147 p_164   42955250    18   360,804
1803147 p_164   42955251    19  597,787
1803147 p_164   42955252    19   360,008
1803148 p_249   42955253    0    
1803148 p_249   42955254    0   Note
1803148 p_249   42955255    0    
1803148 p_249   42955256    0   2017£
1803148 p_249   42955257    0    
1803148 p_249   42955258    0   2016£
1803148 p_249   42955259    1   FIXED ASSETS

1 个答案:

答案 0 :(得分:0)

除非您有固定(或至少有限)的列数,否则您无法真正进行转置或交叉制表。

也就是说,我认为您可以通过使用PostgreSQL的数组完全完成您要尝试的操作。

select col_2, array_agg (col_5) as col_5_values
from source_table
group by col_2, col_4

我认为您会发现解构值非常容易。例如array [2](col_5_values[2])给出了数组中的第二个元素。