将多行组合成单行

时间:2017-10-02 20:58:29

标签: sql postgresql select group-by multiple-columns

我有下表:

|  ID  |  Description|  Shelf  |  QTY  |
----------------------------------------
|  10  | Apples      |    1    |   24  |
|  10  | Apples      |    2    |   28  |
|  10  | Apples      |    6    |   12  |
|  15  | Oranges     |    2    |   8   |
|  15  | Oranges     |    6    |   33  |

我需要对此表进行一些更新,并将Shelf和QTY作为一个组放在一起,如下所示:

|  ID  |  Description|    Availability    |
-------------------------------------------
|  10  | Apples      |  1-24, 2-28, 6-12  |
|  15  | Oranges     |  2-8, 6-33         |

基本上,我们尝试将货架和QTY分组在一行中。 这仅用于报告目的,因此我必须以这种方式显示数据。

到目前为止,我可以通过连接它们并添加短划线来显示两列:

SELECT ID, Description, Shelf || '-' || QTY AS Availability FROM tbl_Products

要将它们拼接在一起,我很确定我可以使用WHILE循环遍历值并创建可用性字符串字段,然后将其插回临时表,然后将其打印到报告中。

但我对表现不太确定。由于此查询将在一个大表中运行,我只是担心每次提取报表时它都会降低数据库的速度。

那么还有其他更容易实现的方法吗?

2 个答案:

答案 0 :(得分:3)

string_agg将完全适合该法案:

SELECT   id, description, STRING_AGG(shelf || '-' || qty, ', ') AS Availability
FROM     tbl_Products
GROUP BY id, description

答案 1 :(得分:2)

您可以使用string_agg()

select id, description,
       string_agg( shelf || '-' || qty, ', ') as availability
from t
group by id, description;