带附加列的Postgres数据透视表

时间:2019-09-29 11:35:12

标签: sql postgresql pivot crosstab

我需要在Postgres中实现数据透视表,但是我不知道该怎么做。使用的函数应该是let users = {Alan: {age: 27,online: false},Jeff: {age: 32,online: true},Ryan: {age: 19,online: true}}; let count = Object.values(users) .filter(({ online }) => online) .length console.log(count),但是我不确定我是否知道如何正确使用它。

给出如下表格:

crosstab()

我必须得到这样的东西:

column a | column b | column c | value 1 | value 2

       0 |
       1 |
       2 |
       3 |
       4 |

所以我需要将行0,...,4作为列,并将column c | Column b | 0 | 1 | 2 | 3 | 4 | |value 1|value 1|value 1|value 1|value 1| | | 作为值。 value 1函数需要3列,但我需要同时出现crosstab()column c

1 个答案:

答案 0 :(得分:1)

"column c""column b"是所谓的“额外”列。将它们放在行名之后和类别之前:

SELECT * FROM crosstab(
      'SELECT "column a", "column c", "column b"
              ,"value 2", "value 1"
       FROM   tbl
       ORDER  BY 1'
     , 'VALUES (0), (1), (2), (3), (4)'
   ) AS ct (
    "column a" text
  , "column c" text
  , "column b" text
  , "0" int
  , "1" int
  , "2" int
  , "3" int
  , "4" int);

要发表您的评论:
这些是嵌套的数字文字,无需引号:

     , 'VALUES (0), (1), (2), (3), (4)'

String 文字需要引号(我现在使用美元引号作为外部引号):

     , $$VALUES ('V0'), ('V1'), ('V2'), ('V3'), ('V4')$$

或者:

     , $$SELECT unnest('{V0,V1,V2,V3,V4}'::text[])$$

db <>提琴here

请参阅:

关于crosstab()

...带有额外的列:

并考虑合理的列名。 (假设给定的名称只是象征性的。)