如何转到生成的列?

时间:2019-02-13 12:50:30

标签: sql postgresql

我目前有一个SQL查询,该查询创建以下输出:

+---------+----------+
| Project |    ID    |
+---------+----------+
| X       | Tom      |
| X       | Matt     |
| X       | Steve    |
| Y       | Richard  |
| Y       | Tom      |
| Y       | Garfield |
| Y       | Katie    |
+---------+----------+

我需要将其调整为如下所示:

+---------+---------+------+----------+-------+--+
| Project |   ID    | ID1  |   ID2    |  ID3  |  |
+---------+---------+------+----------+-------+--+
| X       | Tom     | Matt | Steve    |       |  |
| Y       | Richard | Tom  | Garfield | Katie |  |
+---------+---------+------+----------+-------+--+

背景是我有一个由服务器生成的事件表,以及一个按项目具有特定权限级别的用户表。如果将它们合并,则事件表的大小会爆炸,稍后在工作流中,记录数将用于某些方面。因此,我只想使用project作为键,并以具有特定权限级别的用户列表作为附加列。

最大的困难是,这是动态的,因为重新分配了权限并创建/删除了项目。

2 个答案:

答案 0 :(得分:0)

确实不能。在SQL中,返回的列数由您发送的查询定义,而不是结果集本身定义。

但是,您可以使用一个数组(=单列中的变量数目可变)。使用以下作为子查询:

SELECT project, array_agg(id)
FROM T
GROUP BY project

答案 1 :(得分:0)

您可以尝试使用conditional aggregation

DEMO

select project, 
       max(case when rn=1 then id end) as ID, 
       max(case when rn=2 then id end) ID1,
       max(case when rn=3 then id end) as ID2, 
       max(case when rn=4 then id end) as ID3
from
(
select Project,id, row_number() over(partition by project order by null) as rn
from tablename
)A group by project

输出:

project id    id1     id2       id3
X       Tom   Steve   Matt  
Y       Katie Richard Garfield  Tom