名称动态列plsql plsql(pivot)

名称动态列plsql plsql(pivot),sql,oracle,plsql,pivot,Sql,Oracle,Plsql,Pivot,如何使用变量名创建列的名称,可能吗 SELECT '05/07/2019' as sysdate FROM dual 问题是当我要做枢轴时,我有行 PRODUCT | VALUE :------ | ----: Shirts | 1200 tax | 15 Stocks | 500 tax | 20 SELECT * FROM test_data PIVOT ( SUM( value ) FOR product IN ( 'Shirts'

如何使用变量名创建列的名称,可能吗

SELECT '05/07/2019' as sysdate
  FROM dual
问题是当我要做枢轴时,我有行

PRODUCT | VALUE
:------ | ----:
Shirts  |  1200
tax     |    15
Stocks  |   500
tax     |    20

SELECT *
FROM   test_data
PIVOT ( SUM( value ) FOR product IN (
  'Shirts'  AS Shirts, -- Estos nombres se generan dinamicamente con una LISTAGG
  'tax'     AS tax,
  'Stocks'  AS Stocks,
  'tax'     AS tax
) ) p
错误:
ORA-00918:列定义不明确

很明显,这是因为税收的价值,我想得到的是:

SHIRTS | tax (Shirts) | STOCKS | tax (Stocks)
-----: | -----------: | -----: | -----------:
  1200 |           35 |    500 |           35

请记住,我正在动态构建的pivot的列,因此我无法为它们指定手动名称,由于寄存器是动态的,下面的解决方案假定您有一种方法来对数据进行适当的排序,并且在产品列中找到的每一行都是基于前一行的税。该解决方案使用LAG,然后基于前一行的乘积使用串联创建唯一的新列名

WITH test_data AS
(
  --PRODUCT | VALUE
  --:------ | ----:
  SELECT 1 AS ord, 'Shirts' AS product, 1200 AS value FROM dual UNION ALL
  SELECT 2 AS ord, 'tax',      15            FROM dual UNION ALL
  SELECT 3 AS ord, 'Stocks',   500           FROM dual UNION ALL
  SELECT 4 AS ord, 'tax',      20            FROM dual
)

--SELECT * FROM   test_data

, test_data_extended AS
(
  SELECT product, value, LAG(product, 1) OVER (ORDER BY ord) AS pre_product
  FROM test_data
)

, test_data_new AS
(
  SELECT product AS old_product, value
    /* If ordering is available you can rename the field before the PIVOT to make the new PIVOT column Unique */
    , CASE WHEN product = 'tax' THEN 'tax (' || pre_product || ')' ELSE product END AS new_product
  FROM test_data_extended
)

, new_data AS
(
  SELECT new_product, value
  FROM test_data_new
)

SELECT * FROM new_data
PIVOT 
( 
  SUM( value )
  FOR new_product IN 
  (
    'Shirts'       AS "Shirts",
    'tax (Shirts)' AS "tax (Shirts)",
    'Stocks'       AS "Stocks",
    'tax (Stocks)' AS "tax (Stocks)"
  )
) 
;

Any chance
test\u data
是否有任何行排序列(ID、DateTime等)?@Gdaimon当查看包含简单命名为“tax”的行的表时,您如何知道该行所指的是什么?如。。。你怎么知道这一行是基于什么税,是衬衫税还是股票税还是其他?税务行是否仅基于其前面的行基于某种排序?您发布的源表中没有任何内容允许您对
'tax'
行进行排序。如果没有一个有意义的密钥,就无法提供您想要的结果。@APC对不起,您是绝对正确的,如果您有一个可以加入的id,但这是加入他们后的结果,如果我输入数据的来源,您就可以很好地解决问题了…?@Serg如果您有一个可以加入的id,但这是连接和过滤后的结果,如果我把数据的来源放在这里似乎很好