SQL |根据条件将列视为多列

SQL |根据条件将列视为多列,sql,postgresql,Sql,Postgresql,新手Postgresql(9.6.6)这里的问题:) 我想创建一个视图,根据不同的条件将单个列拆分为多个列 示例表 Name Score Season ------- ------- -------- John 12 Fall John 15 Winter John 13 Spring Sally 17 Fall Sally 10 Winter Sal

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

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

示例表

Name Score Season ------- ------- -------- John 12 Fall John 15 Winter John 13 Spring Sally 17 Fall Sally 10 Winter Sally 14 Spring Henry 16 Fall Henry 12 Winter Henry 18 Spring 记分季节 ------- ------- -------- 约翰12号坠落 约翰·温特 约翰·斯普林 莎莉17号坠落 莎莉·温特 莎莉14岁春天 亨利16号坠落 亨利12温特 亨利·斯普林 我希望视图显示如下内容:

Name Fall Score Winter Score Spring Score ------- ------------ -------------- -------------- John 12 15 13 Sally 17 10 14 Henry 16 12 18 姓名秋季成绩冬季成绩春季成绩 ------- ------------ -------------- -------------- 约翰121513 莎莉171014 亨利161218 其中“分数”字段分为几个不同的列,每个列根据引用“季节”字段的Where子句填充。为了达到这个目的,我研究了窗口函数和CASE语句,但到目前为止还没有成功


非常感谢您的帮助

您需要一个数据透视表:

在SQL server上,您可以执行类似于此示例的操作(希望Postgres也是如此),在其他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

在对
名称
进行分组的同时,从整个表格中选择,然后有条件地对
得分
列进行
求和
ming将起作用:

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
seasure
)对有一行,那么
SUM()
将与
MAX()

同样有效。我喜欢您的答案:)谢谢克里斯蒂娜!我也不确定博士后是否能做到你在这里概述的那样,但幸运的是,e_I_pi提供的答案非常有效。