我有一个数据库表'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中获取它?
答案 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
...