将结果分组为一行,结果为列?

时间:2015-07-30 08:09:12

标签: sql postgresql group-by sum pivot

我有一个这样的分数表:

 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 

我确信这很简单,但我很难过。提前感谢您的帮助。

3 个答案:

答案 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分。无论你的桌子如何增长,这都应该有效。