暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将行动态转换为列

askTom 2017-02-22
230

问题描述

嗨,汤姆,

我有一个数据如下的表格

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做到这一点:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论