分组依据作为单行,结果作为一列?
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 如何增长,这都应该有效。
我有这样的分数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 如何增长,这都应该有效。