Sql 将列值设置为一行
我是SQL新手,有4列与此类似,我希望将值与一些额外的文本放在一行中 身份证件 代号 价值 名称 1. 价格 100 苹果 1. 增值税 25 苹果 1. 服务费 5. 苹果 2. 价格 200 杏 2. 增值税 50 杏 2. 服务费 5. 杏 3. 价格 300 芒果 3. 增值税 75 芒果 3. 服务费 10 芒果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
您可以使用聚合并连接这些值:
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
;