我有一个这样的分数表:
code | week | points
1001 | 1 | 2
1001 | 1 | 1
1001 | 3 | 6
2001 | 1 | 0
2001 | 4 | 5
2001 | 4 | 2
我想要的是这样的结果:
code | 1 | 3 | 4
1001 | 3 | 6 |
2001 | 0 | | 7
我编写了一个简单的组,我可以使用它编写一些代码,但我宁愿在SQL中完成工作。 http://sqlfiddle.com/#!15/8ff5d
select code, week, sum(points) as total
from scores
group by code, week
order by code, week;
结果是:
code | week | total
1001 | 1 | 3
1001 | 3 | 6
2001 | 1 | 0
2001 | 4 | 7
我确信这很简单,但我很难过。提前感谢您的帮助。
答案 0 :(得分:0)
您正在寻找PIVOT功能:
类似的问题:Create a pivot table with PostgreSQL
当列数被修复时,它或多或少变得简单。
如果数字是动态的,那么搜索动态数据透视。
答案 1 :(得分:0)
通用方法
select
code,
sum(case when week=1 then points else 0 end) as week1,
sum(case when week=2 then points else 0 end) as week2,
sum(case when week=3 then points else 0 end) as week3,
sum(case when week=4 then points else 0 end) as week4
from table
group by code
答案 2 :(得分:0)
你想要做的事实上并不简单,我不认为!看起来你想要一组具有可变列数的结果,这在大多数情况下并不是SQL的工作原理。
以这种方式思考:如果你的桌子更大,并且有不同的周数,你的结果将会是这样的:
code | 1 | 3 | 4 | 5 | 7 | 8 | 9 | ... | ...
1001 | 3 | 6 | | 1 | 3 | etc. ...
2001 | 0 | | 7 | 2 | | ...
某些类型的SQL允许您透视表,它会切换行和列的方向,这基本上就是您想要做的。但是,我不认为PostgreSQL有这个。
但是,你可以做的是将一组结果转换为一个数组,这样你就会得到一个列中包含任意数量值的数组。
看起来像这样的东西可能就是你想要的东西:
SELECT code, array_agg(ROW(week, total)) AS week_array
FROM (select code, week, sum(points) as total
from scores
group by code, week
ORDER BY week) AS row
GROUP BY code
ORDER BY code;
该数组将具有{("1", 0), ("3", 8)}
之类的元组,这意味着第1周为0分,第3周为8分。无论你的桌子如何增长,这都应该有效。