如何输出两列分组的结果,其中一列值为行,另一列为列?

时间:2018-12-26 10:08:55

标签: sql postgresql group-by

我有这样的桌子

id  col1    col2
1   A       1
2   B       0
3   A       1
4   C       1
5   B       0
6   A       0
7   C       1
8   C       1
9   B       1
10  B       0

我需要类似这样的查询

Values  1   0
A       2   1
B       1   3
C       3   0

在以上结果中,标题显示了col2个不同的值(1,0),行名表示了col1的不同值。表格中的值显示计数。

是否有人建议在postgresql中得到这样的结果?

3 个答案:

答案 0 :(得分:2)

您需要条件聚合:

select col1,
       sum(case when col2 = 1 then 1 else 0 end) as 1,
       sum(case when col2 = 0 then 1 else 0 end) as 0
from table t
group by col1;

答案 1 :(得分:1)

您也可以使用FILTER

SELECT 
    col1,
    COUNT(*) FILTER (WHERE col2 = 1) AS 1,
    COUNT(*) FILTER (WHERE col2 = 0) AS 0,      
FROM 
    foo
GROUP BY 
    col1;

答案 2 :(得分:0)

以下是编写此逻辑的更简单方法。第一个是Postgres特定的:

select col1,
       sum( (col2 = 1)::int ) as num_1,
       sum( (col2 = 0)::int as num_0
from t
group by col1;

第二个只是使用算术:

select col1,
       sum( col2 ) as num_1,
       sum( 1 - col2 ) as num_0
from t
group by col1;