将sql行合并到其他列中

时间:2013-12-17 19:33:57

标签: sql postgresql postgresql-9.1

我有一个数据库表'stock_usage'看起来像这样。

id  |   item_id |   store_id    |   quantity    |   timestamp   
-------------------------------------------------------------

有一个item表和一个store表。我在csv中使用第一列中的项目创建库存使用情况报告,其余表示商店,每个商店包含如下所用的总数量。

item_name   |   store_A |   store_B |   store_C |...
----------------------------------------------------
soap        |   3       |   4       |   5       |

我目前的解决方案是检索每个商店的每个商品的总数,如下所示,并在php中循环结果以获得上述结构。

item_name   |   store   |   quantity
------------------------------------
soap        |   store_A |   3
soap        |   store_B |   4
soap        |   store_C |   5

有没有办法在没有附加代码的情况下在sql中获取它?

1 个答案:

答案 0 :(得分:3)

PostgreSQL当然支持pivot功能。使用其他模块crosstab()中的tablefunc。是否“原生”是否存在争论。

每个数据库运行一次:

CREATE EXTENSION tablefunc;

并考虑这个详细解释:
PostgreSQL Crosstab Query

然而,您要做的是与枢轴功能相反!反向枢轴。我会使用UNION ALL

SELECT item_name, 'store_A'::text AS store, store_a AS quantity
FROM   stock_usage

UNION ALL
SELECT item_name, 'store_B'::text, store_b
FROM   stock_usage

UNION ALL
SELECT item_name, 'store_C'::text, store_c
FROM   stock_usage

...