【问题标题】:Create table view summing all columns in a row and all rows for a column where row name is equal to column name创建表格视图,汇总一行中的所有列以及行名等于列名的列的所有行
【发布时间】:2019-01-26 04:53:46
【问题描述】:

我有一个如下所示的 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  

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

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这可以使用条件窗口总和来完成,例如:

    SELECT 
        name, 
        (rock + paper + scissors) AS strong,
        CASE name
            WHEN 'rock'     THEN SUM(rock)     OVER()
            WHEN 'paper'    THEN SUM(paper)    OVER()
            WHEN 'scissors' THEN SUM(scissors) OVER()
        END AS weak
    FROM mytable 
    

    Demo

    【讨论】:

    • 有很多好的答案,但我选择了这个,因为它看起来最干净。我总是忘记你可以在 postgres 中做条件。
    【解决方案2】:

    可以如下创建视图:

    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
    

    【讨论】:

      【解决方案3】:

      您可以为此使用窗口函数:

      select name, (rock + paper + scissors) as strong,
             (case when name = 'rock' then sum(rock) over ()
                   when name = 'paper' then sum(paper) over ()
                   when name = 'scissors' then sum(scissors) over ()
              end) as weak
      from t;
      

      【讨论】:

        猜你喜欢
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        相关资源
        最近更新 更多