Postgresql - 使用 Crosstab 或替代方法进行透视?
Postgresql - Pivot with Crosstab or alternative?
我有以下 table:
我想旋转它并得到以下结果:
Table_name Column_name Values ddmf_etl_id
"PROFITCENTERID" "CO_AREA" "DE02" 16807487
"PROFITCENTERID" "PROFIT_CTR" "0000001119" 16807487
"PROFITCENTERID" "CO_AREA" "DE02" 16807488
"PROFITCENTERID" "PROFIT_CTR" "0000001120" 16807488
不幸的是,我未能使用以下 select 执行此操作,因为 CROSSTAB 的参数数量有限 (3):
SELECT 'PROFITCENTERID' AS table_name,t.*
FROM
crosstab(
'SELECT unnest(''{CO_AREA,PROFIT_CTR}''::text[]) AS col
, row_number() OVER ()
, unnest(ARRAY[CO_AREA::text,PROFIT_CTR::text]) AS val
FROM "1".PROFITCENTER_PROFITCENTERID'
) t (column_name text, values text);
select 语句的结果(错误):
在 Postgresql 中是否有其他替代交叉表的方法?或者也许可以用 Crosstab 做到这一点?
感谢任何帮助!谢谢!
使用unnest()
将每行加倍并select适当的值:
select
'profitcenterid' as table_name,
unnest(array['co_area', 'profit_ctr']) as column_name,
unnest(array[co_area, profit_ctr]) as value,
ddmf_etl_id as ddmf_etl_id
from profitcenter_profitcenterid
table_name | column_name | value | ddmf_etl_id
----------------+-------------+------------+-------------
profitcenterid | co_area | de02 | 16807487
profitcenterid | profit_ctr | 0000001119 | 16807487
profitcenterid | co_area | de02 | 16807488
profitcenterid | profit_ctr | 0000001120 | 16807488
(4 rows)
但是,这对获得预期的 json 结果帮助不大。您想获取任意键名,因此无法根据子查询结果自动生成对象。它们可以用原语 jsonb_build_object()
:
创建
select to_jsonb(s)
from (
select
'profitcenterid' as table_name,
17 as type,
'' as value,
jsonb_build_array(
jsonb_build_object('name', 'co_area', 'value', co_area, 'type', 0, 'children', '[]'::jsonb),
jsonb_build_object('name', 'profit_ctr', 'value', profit_ctr, 'type', 0, 'children', '[]'::jsonb)
) as children
from profitcenter_profitcenterid
) s
附带说明一下,预期的结构似乎不必要地复杂,简单是一种美德。
我有以下 table:
我想旋转它并得到以下结果:
Table_name Column_name Values ddmf_etl_id
"PROFITCENTERID" "CO_AREA" "DE02" 16807487
"PROFITCENTERID" "PROFIT_CTR" "0000001119" 16807487
"PROFITCENTERID" "CO_AREA" "DE02" 16807488
"PROFITCENTERID" "PROFIT_CTR" "0000001120" 16807488
不幸的是,我未能使用以下 select 执行此操作,因为 CROSSTAB 的参数数量有限 (3):
SELECT 'PROFITCENTERID' AS table_name,t.*
FROM
crosstab(
'SELECT unnest(''{CO_AREA,PROFIT_CTR}''::text[]) AS col
, row_number() OVER ()
, unnest(ARRAY[CO_AREA::text,PROFIT_CTR::text]) AS val
FROM "1".PROFITCENTER_PROFITCENTERID'
) t (column_name text, values text);
select 语句的结果(错误):
在 Postgresql 中是否有其他替代交叉表的方法?或者也许可以用 Crosstab 做到这一点?
感谢任何帮助!谢谢!
使用unnest()
将每行加倍并select适当的值:
select
'profitcenterid' as table_name,
unnest(array['co_area', 'profit_ctr']) as column_name,
unnest(array[co_area, profit_ctr]) as value,
ddmf_etl_id as ddmf_etl_id
from profitcenter_profitcenterid
table_name | column_name | value | ddmf_etl_id
----------------+-------------+------------+-------------
profitcenterid | co_area | de02 | 16807487
profitcenterid | profit_ctr | 0000001119 | 16807487
profitcenterid | co_area | de02 | 16807488
profitcenterid | profit_ctr | 0000001120 | 16807488
(4 rows)
但是,这对获得预期的 json 结果帮助不大。您想获取任意键名,因此无法根据子查询结果自动生成对象。它们可以用原语 jsonb_build_object()
:
select to_jsonb(s)
from (
select
'profitcenterid' as table_name,
17 as type,
'' as value,
jsonb_build_array(
jsonb_build_object('name', 'co_area', 'value', co_area, 'type', 0, 'children', '[]'::jsonb),
jsonb_build_object('name', 'profit_ctr', 'value', profit_ctr, 'type', 0, 'children', '[]'::jsonb)
) as children
from profitcenter_profitcenterid
) s
附带说明一下,预期的结构似乎不必要地复杂,简单是一种美德。