问题描述
嗨,汤姆,
我有一个数据如下的表格
BRANCHNAME CUSTOMERNUM
100 1001010
100 1001011
103 1001012
104 1001013
104 1001014
104 1001015
105 1001016
105 1001017
106 1001018
现在我的要求是获得如下的输出。获取分支名称的计数并将其转换为列
100 103 104 105 106
2 1 3 2 1
我通过使用下面的sql满足了要求
标签为 (
选择分支名称,按分支名称从分支组中计数 (*) cnt)
从 (
当BRANCHNAME = “100” 时选择大小写,然后CNT以col1结尾,
当BRANCHNAME = '105 '时,CNT以COL2结尾,
当BRANCHNAME = '103 '时,CNT以COL3结尾,
当BRANCHNAME = '106 '时,CNT以COL4结尾,
当BRANCHNAME = '104 '时,CNT以COL5结尾,
排名 () 超过 (按分支顺序按CNT划分) RN
从选项卡)
按注册护士分组
但是如何动态地执行此操作,而不是在案例语句中进行硬编码。请帮帮我
谢谢
拉杰
我有一个数据如下的表格
BRANCHNAME CUSTOMERNUM
100 1001010
100 1001011
103 1001012
104 1001013
104 1001014
104 1001015
105 1001016
105 1001017
106 1001018
现在我的要求是获得如下的输出。获取分支名称的计数并将其转换为列
100 103 104 105 106
2 1 3 2 1
我通过使用下面的sql满足了要求
标签为 (
选择分支名称,按分支名称从分支组中计数 (*) cnt)
从 (
当BRANCHNAME = “100” 时选择大小写,然后CNT以col1结尾,
当BRANCHNAME = '105 '时,CNT以COL2结尾,
当BRANCHNAME = '103 '时,CNT以COL3结尾,
当BRANCHNAME = '106 '时,CNT以COL4结尾,
当BRANCHNAME = '104 '时,CNT以COL5结尾,
排名 () 超过 (按分支顺序按CNT划分) RN
从选项卡)
按注册护士分组
但是如何动态地执行此操作,而不是在案例语句中进行硬编码。请帮帮我
谢谢
拉杰
专家解答
如果要将行转换为列,则确实应该使用pivot!
这有所帮助,但是动态列仍然是一个挑战。你可以用XML pivoting做到这一点:
但是现在你必须解析XML...
或者,您可以使用动态SQL。有了这个,你可以使用listagg的或类似的创建IN子句。然后将其添加到您的语句中,例如:
最后是Anton Scheffer的自定义类型解决方案:
https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/
您可以在以下位置阅读更多关于一般枢转和动态枢转的信息:
https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot
这有所帮助,但是动态列仍然是一个挑战。你可以用XML pivoting做到这一点:
create table t ( BRANCHNAME int, CUSTOMERNUM int ); insert into t values (100, 1001010); insert into t values (100, 1001011); insert into t values (103, 1001012); insert into t values (104, 1001013); insert into t values (104, 1001014); insert into t values (104, 1001015); insert into t values (105, 1001016); insert into t values (105, 1001017); insert into t values (106, 1001018); set long 100000 select * from ( select BRANCHNAME from t ) pivot xml (count(*) for branchname in (any));100 2 103 1 104 3 105 2 106 1 复制
但是现在你必须解析XML...
或者,您可以使用动态SQL。有了这个,你可以使用listagg的或类似的创建IN子句。然后将其添加到您的语句中,例如:
declare sql_stmt varchar2(4000); pivot_clause varchar2(4000); begin select listagg('''' || BRANCHNAME || ''' as "' || BRANCHNAME || '"', ',') within group (order by BRANCHNAME) into pivot_clause from (select distinct BRANCHNAME from t); sql_stmt := 'select * from (select branchname from t) pivot (count(*) for branchname in (' || pivot_clause || '))'; execute immediate sql_stmt; end; /复制
最后是Anton Scheffer的自定义类型解决方案:
https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/
您可以在以下位置阅读更多关于一般枢转和动态枢转的信息:
https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
597次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
574次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
488次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
474次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
458次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
434次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
433次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
419次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
366次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05