Sql 将列值设置为一行

Sql 将列值设置为一行,sql,oracle,plsql,Sql,Oracle,Plsql,我是SQL新手,有4列与此类似,我希望将值与一些额外的文本放在一行中 身份证件 代号 价值 名称 1. 价格 100 苹果 1. 增值税 25 苹果 1. 服务费 5. 苹果 2. 价格 200 杏 2. 增值税 50 杏 2. 服务费 5. 杏 3. 价格 300 芒果 3. 增值税 75 芒果 3. 服务费 10 芒果 您可以使用聚合并连接这些值: SELECT ID, NAME, ( MAX(CASE WHEN CODE_NAME = 'PRICE' THEN RC.AMOU

我是SQL新手,有4列与此类似,我希望将值与一些额外的文本放在一行中

身份证件 代号 价值 名称 1. 价格 100 苹果 1. 增值税 25 苹果 1. 服务费 5. 苹果 2. 价格 200 杏 2. 增值税 50 杏 2. 服务费 5. 杏 3. 价格 300 芒果 3. 增值税 75 芒果 3. 服务费 10 芒果
您可以使用聚合并连接这些值:

SELECT ID, NAME,
       ( MAX(CASE WHEN CODE_NAME = 'PRICE' THEN RC.AMOUNT END) || '/' ||
         MAX(CASE WHEN CODE_NAME = 'VAT' THEN RC.AMOUNT END) || '/' ||
         MAX(CASE WHEN CODE_NAME = 'SERVICE FEE' THEN RC.AMOUNT END) 
       ) as value
FROM PRODUCTS
GROUP BY ID, NAME;

透视数据,然后连接结果列中的值,添加所需的额外位。像这样的。(请注意
with
子句,它不是解决方案的一部分;我仅将其用于测试。请删除它,并在
select
语句中使用实际的表名和列名。)

或者,您可以像这样使用
listag

select id, name,
       listagg('x' || value || decode(code_name, 'Price', 'p', 'Vat', 'v', 's'), '/')
           within group (order by decode(code_name, 'Price', 1, 'Vat', 2, 3))
       as value
from   products
group  by id, name
order  by id
;

我不是在计算机前,但您可以尝试在MS SQL Server中实现这一点。请解释生成所需值的逻辑。它们不在原始数据中。这似乎没有按要求添加文本位。
select id, name,
       listagg('x' || value || decode(code_name, 'Price', 'p', 'Vat', 'v', 's'), '/')
           within group (order by decode(code_name, 'Price', 1, 'Vat', 2, 3))
       as value
from   products
group  by id, name
order  by id
;