行转列

测试数据:

--创建表:
create table DRUG_DETAILS
(
  drug_name VARCHAR2(10),
  drug_id   VARCHAR2(10),
  price     NUMBER(8,2),
  pat_id    VARCHAR2(10)
)
--插入测试数据:
INSERT INTO drug_details VALUES('阿莫西林','1',10.2);
INSERT INTO drug_details VALUES('枇杷膏','2',8.3);
INSERT INTO drug_details VALUES('感康','3',9.2);
INSERT INTO drug_details VALUES('生理盐水','4',1);
INSERT INTO drug_details VALUES('葡萄糖','5',2);
INSERT INTO drug_details VALUES('酒精','6',7.6);

数据预览:

目标:

 

--SQL参考一 行转列  关键函数:decode
SELECT 
t.pat_id
,SUM(DECODE(t.drug_name,'阿莫西林',t.price)) AS 阿莫西林
,SUM(DECODE(t.drug_name,'枇杷膏',t.price)) AS 枇杷膏
,SUM(DECODE(t.drug_name,'感康',t.price)) AS 感康
,SUM(DECODE(t.drug_name,'生理盐水',t.price)) AS 生理盐水
,SUM(DECODE(t.drug_name,'葡萄糖',t.price)) AS 葡萄糖
,SUM(DECODE(t.drug_name,'酒精',t.price)) AS 酒精
FROM drug_details t
GROUP BY t.pat_id
--SQL参考二 行转列  关键函数:PIVOT
SELECT * 
FROM (SELECT pat_id,drug_name,price FROM drug_details) PIVOT (
SUM(price) FOR  drug_name IN ('阿莫西林' AS 阿莫西林,'枇杷膏' AS 枇杷膏,'感康' AS 感康,'生理盐水' AS 生理盐水,'酒精' AS 酒精,'葡萄糖' AS 葡萄糖)
)

 

以上两种方式需要穷举列名,存在限制。可以考虑聚合列的方式,对聚合数据代码中解析:

--SQL参考三 行转列 将结果聚合,代码或脚本中二次拆分
--关键函数 listagg
 SELECT t.pat_id,listagg(drug_name||'#'||price,'$') WITHIN GROUP(ORDER BY 1) AS lob_str
 FROM drug_details t GROUP BY t.pat_id

效果:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值