首页 > 解决方案 > 创建表格视图,汇总行中的所有列以及行名等于列名的列的所有行

问题描述

我有一个如下所示的 postgresql 表:

name      |rock|paper|scissors
__________|____|_____|________
rock      | .5 |  0  |   2
paper     | 2  |  1  |   0
scissors  | 1  |  4  |   2

我想创建一个 postgresql 视图,将每个名称的行和列汇总在一起,如下所示:

name      |strong|weak
__________|______|____
rock      |  2.5 | 2.5  
paper     |  3   | 5  
scissors  |  7   | 4  

我在第二个表中想要的是两列。一个是第一个表的行中所有列的总和,按名称分隔。第二列是该列等于名称的行的总和。


我可以让strong专栏按我想要的方式工作,但我不知道如何获得weak专栏。这是我最近的尝试。

SELECT 
    name, 
    (rock + paper + scissors) AS strong, 
    (sum(rock) + sum(paper) + sum(scissors)) AS weak 
FROM mytable 
GROUP BY name;

这只会生成一个弱列等于强列的表,如下所示:

name      |strong|weak
__________|______|____
rock      |  2.5 | 2.5  
paper     |  3   | 3  
scissors  |  7   | 7  

我怎样才能达到我想要的结果?

标签: sqlpostgresql

解决方案


可以创建视图,如下所示:

create view v1 as
select
  name,
  rock + paper + scissors as strong,
  (select
     sum(case 
       when t1.name = 'rock' then t2.rock
       when t1.name = 'paper' then t2.paper
       when t1.name = 'scissors' then t2.scissors
       end
     ) from mytable t2
  ) as weak
from mytable t1

推荐阅读