查看: 646|回复: 13

[SQL] 求简捷的行转列做法

[复制链接]
论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-24 06:00:15
发表于 2019-11-30 10:27 | 显示全部楼层 |阅读模式
with temp as(  
  select 'China' nation  from dual union all  
  select 'USA' nation  from dual union all  
  select 'Japan' nation  from dual   
)  
select nation
from temp  
查询结果
NATION
China
USA
Japan

想行转列,把这三行变成三列
NATION1    NATION2   NATION3
China      USA       Japan

我的做法是:用listagg用逗号把这三列串成一列,然后再用substr、length分别截取成三列
但感觉比较麻烦,因为还要判断是第几个逗号,
哪位朋友有更好的,更快,更简捷的做法???????
with temp as(  
  select 'China' nation  from dual union all  
  select 'USA' nation  from dual union all  
  select 'Japan' nation  from dual   
)  
select listagg(nation,',') within GROUP (order by nation)  nation
from temp  
查询结果
NATION
China,Japan,USA



论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-24 06:00:15
 楼主| 发表于 2019-11-30 16:31 | 显示全部楼层
哪位朋友有更好的,更快,更简捷的做法???????

使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2019-11-30 18:06 | 显示全部楼层
pivot

使用道具 举报

回复
论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-24 06:00:15
 楼主| 发表于 2019-11-30 19:05 | 显示全部楼层
哪位朋友有更好的,更快,更简捷的做法???????

使用道具 举报

回复
论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-24 06:00:15
 楼主| 发表于 2019-11-30 20:31 | 显示全部楼层

3楼,象我这个例子,请问要怎么写啊,调试总是出错,

使用道具 举报

回复
论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-24 06:00:15
 楼主| 发表于 2019-11-30 20:32 | 显示全部楼层
用pivot 总提示右括号缺失

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-12-1 06:54 | 显示全部楼层
billlyh 发表于 2019-11-30 20:32
用pivot 总提示右括号缺失

你不把自己写的贴出来,能指望别人通过错误信息反推你写了什么,然后指出问题在哪里?
你写的例子过于简单,没有指明按照什么规则把这三个值分配给三列。如果有什么排序的规则,在数据中应该体现出来,比如另外有个列表明1,2,3的顺序。
如果你的数据出现了第四行,那么你写的静态SQL是不能自动出现第四列的,静态SQL的输出结构也是静态的。

使用道具 举报

回复
论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-24 06:00:15
 楼主| 发表于 2019-12-1 12:11 | 显示全部楼层
with temp as(  
  select 'China' nation ,'Guangzhou' city from dual union all  
  select 'China' nation ,'Shanghai' city from dual union all  
  select 'China' nation ,'Beijing' city from dual union all  
  select 'USA' nation ,'New York' city from dual union all  
  select 'USA' nation ,'Bostom' city from dual union all  
  select 'Japan' nation ,'Tokyo' city from dual   
)  
select
       pivot(max(nation) for city in ( 'China','USA', 'Japan'))
from temp  
group by nation ;

ORA-00907:missing right parenthesis

使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2019-12-1 16:25 | 显示全部楼层
语法不对,列名也写错
参考
http://www.oracle.com/technetwor ... vot-101924-zhs.html

使用道具 举报

回复
论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2019-12-1 17:15 | 显示全部楼层
with temp as(  
  select 'China' nation  from dual union all  
  select 'USA' nation  from dual union all  
  select 'Japan' nation  from dual   
)   
select * from temp
       pivot(max(nation) for nation  in ( 'China','USA', 'Japan'))
;

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表