我有一个级别和年份表,大致如下所示:
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)
有没有一种直接的方法来查询像这样的枢轴视图?对于更广泛的等级和年份?
您可以使用交叉表对数据进行透视,但通常它需要一个众所周知的列名称。
首先你应该安装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在这里