分组依据作为单行,结果作为一列?

Grouping by as a single row with results as a column?

我有这样的分数table:

 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 

我确信这真的很简单,但我很难过。在此先感谢您的帮助。

您正在寻找 PIVOT 函数:
类似问题:Create a pivot table with PostgreSQL

当列数固定时,它或多或少会变得简单。 如果数字是动态的,则搜索动态数据透视表。

通用方法

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

你想做的其实一点都不简单,我不认为!看起来您想要一组具有可变列数的结果,大多数时候 SQL 并不是这样工作的。

这样想:如果您的 table 更大,并且其中有许多不同的星期,您的结果将如下所示:

code     | 1  | 3 | 4 | 5 | 7 | 8 | 9 | ... | ...
1001     | 3  | 6 |   | 1 | 3 | etc. ...
2001     | 0  |   | 7 | 2 |   | ...

SQL 的某些变体可以让您旋转 table,它可以切换行和列的方向,这基本上就是您想要做的。但是,我认为 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 分。无论您的 table 如何增长,这都应该有效。