【问题标题】:SQL | View Column as Multiple Columns Based on ConditionsSQL |根据条件将列视为多列
【发布时间】:2018-01-19 08:23:59
【问题描述】:

新手 Postgresql (9.6.6) 问题在这里 :)

我想创建一个视图,根据不同的条件将一列拆分为几列。

示例表

姓名 评分 赛季 -------- -------- -------- 约翰 12 秋季 约翰 15 冬 约翰 13 春天 莎莉 17 秋季 莎莉 10 冬天 莎莉 14 春天 亨利 16 秋季 亨利 12 冬 亨利 18 春天

我希望视图显示如下所示的内容:

名称 秋季分数 冬季分数 春季分数 -------- ------------ -------------- -------------- 约翰 12 15 13 莎莉 17 10 14 亨利 16 12 18

“Score”字段分为几个不同的列,每个列都基于引用“Season”字段的 WHERE 子句填充。我已经研究了 Window Functions 和 CASE Statements 来实现这个目的,但到目前为止还没有成功。

非常感谢任何帮助!

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    在对Name 进行分组时从整个表中进行选择,然后在Score 列上进行有条件的SUMming 将起作用:

    SELECT
        "Name",
        SUM(CASE WHEN "Season" = 'Fall' THEN "Score" ELSE 0 END) AS "Fall",
        SUM(CASE WHEN "Season" = 'Winter' THEN "Score" ELSE 0 END) AS "Winter",
        SUM(CASE WHEN "Season" = 'Spring' THEN "Score" ELSE 0 END) AS "Spring"
    FROM "mytable"
    GROUP BY "Name"
    

    您是否使用SUM() 取决于您以及您的数据的外观。如果每对 (Name, Season) 有一行,那么 SUM() 将与 MAX() 一样工作

    【讨论】:

    • 我喜欢你的回答:)
    【解决方案2】:

    您需要一个数据透视表:

    在 SQL 服务器上,您可以执行类似此示例的操作(希望 postgress 也是如此),在其他版本的 SQL 中存在 pivot 关系运算符,但我不确定 Pivot 是否适用于 Postgres

    例子:

    CREATE TABLE #Table
    (
       Name nvarchar(400),
       Score int,
       Season nvarchar(400)
    )
    
    insert into #Table values ( 'John ',12,'Fall')
    insert into #Table values ( 'John ',15,'Winter'   )
    insert into #Table values ( 'John ',13,'Spring'   )
    insert into #Table values ( 'Sally',17,'Fall   '  )
    insert into #Table values ( 'Sally',10,'Winter'   )
    insert into #Table values ( 'Sally',14,'Spring'   )
    insert into #Table values ( 'Henry',16,'Fall'    ) 
    insert into #Table values ( 'Henry',12,'Winter'   )
    insert into #Table values ( 'Henry',18,'Spring'  )
    
    select 
        c.Name
        ,sum(c.[Fall Score]) as [Fall Score]
        ,sum(c.[Winter Score]) as [Winter Score]
        ,sum(c.[Spring Score]) as [Spring Score]
    from
    (SELECT 
        t.name,
        case 
            when t.Season = 'Fall' then t.Score
            when t.Season = 'Winter' then 0
            when t.Season = 'Spring' then 0
        end as [Fall Score],
        case 
            when t.Season = 'Fall' then 0
            when t.Season = 'Winter' then t.Score
            when t.Season = 'Spring' then 0
        end as [Winter Score],
        case 
            when t.Season = 'Fall' then 0
            when t.Season = 'Winter' then 0
            when t.Season = 'Spring' then t.Score
        end as [Spring Score]
    from #Table t
    )as c 
    group by c.name
    

    【讨论】:

    • 感谢克里斯蒂娜!我也不确定 Postgres 是否可以做你在那里概述的事情,但幸运的是,e_i_pi 提供的答案很好。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2023-01-10
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多