重塑数据的技巧,类似于枢轴?

Ama*_*nda 4 postgresql pivot

我有一个级别和年份表,大致如下所示:

INSERT INTO demo(first_name, rank, year) AS VALUES
  ('Peter',2,2017), ('Robert',3,2016), ('Evelyn',2,2017), 
  ('Rand',3,2017), ('Kofi',3,2017), ('Daniel',3,2016), ('Leonard',1,2017),
  ('Mary',1,2017), ('Frank',1,2017), ('John',3,2017), ('Mary',1,2016), 
  ('Gilbert',3,2016), ('Quince',2,2017), ('David',3,2017), ('Louis',2,2017),
  ('Felipe',2,2016), ('Alfonso',1,2017), ('Elise',3,2016), ('Jorge',3,2017),
  ('Mary',3,2016), ('Jasvant',2,2017), ('Paul',3,2017), ('Richard',2,2017),
  ('Christopher',2,2017), ('Johannes',2,2016), ('Nasser',3,2016), ('Bruce',3,2017), 
  ('John',3,2016), ('Frederic',3,2016);
Run Code Online (Sandbox Code Playgroud)

我可以用一个非常基本的方法捕获每个级别和年份的总数COUNT()

SELECT  rank, COUNT(*), year
FROM demo
GROUP BY rank, year
ORDER BY year, rank;
Run Code Online (Sandbox Code Playgroud)

这给了我一个相当整洁的演示数据摘要:

Rank  Count  Year
1      1    2016
2      2    2016
3      8    2016
1      4    2017
2      7    2017
3      7    2017
Run Code Online (Sandbox Code Playgroud)

我的实际数据要大得多,我希望能够在一个看起来更像这样的汇总表中看到它:

Rank    2016    2017
1         1     4
2         2     7
3         8     7
Run Code Online (Sandbox Code Playgroud)

有没有一种直接的方法来查询像这样的枢轴视图?对于更广泛的等级和年份?

McN*_*ets 6

您可以使用交叉表对数据进行透视,但通常它需要一个众所周知的列名称。

首先你应该安装tablefunc模块。

CREATE EXTENSION tablefunc;
Run Code Online (Sandbox Code Playgroud)

然后你可以调用一个交叉表

SELECT * FROM 
  crosstab('SELECT rank, year::INT, COUNT(*)::INT ct FROM demo 
            GROUP BY 1, 2 ORDER BY 1, 2') 
  AS ct(rk INT, "2016" INT, "2017" INT)
Run Code Online (Sandbox Code Playgroud)
rk | 2016 | 2017年
-: | ---: | ---:
 1 | 1 | 4
 2 | 2 | 7
 3 | 8 | 7

dbfiddle在这里

  • 我还必须以特权用户身份执行`CREATE EXTENSION tablefunc;`。 (2认同)