首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用合计列进行动态行到列转换

使用合计列进行动态行到列转换
EN

Stack Overflow用户
提问于 2021-05-04 19:33:06
回答 1查看 43关注 0票数 0

表名: sampledata

代码语言:javascript
复制
  id | State_Assign
-----------------
a10  | FL
a11  | AL
a11  | PH
a12  | MA
a12  | GL

我是甲骨文的新手,我已经尝试过了,但正在寻找动态的解决方案,状态分配的数量是动态的,它今天可以为a11 id设置2,但明天可以更改为3。

附件所需的put截图谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-05-05 01:42:58

基本上,您可以使用这样一个包含条件聚合逻辑的静态解决方案

代码语言:javascript
复制
SELECT id,
       MAX(CASE WHEN rn = 1 THEN State_Assign END) AS sa1,
       MAX(CASE WHEN rn = 2 THEN State_Assign END) AS sa2,
       .......
       .......
       COUNT(*) AS total
  FROM (SELECT s.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY 0) AS rn 
          FROM sampledata s)
 GROUP BY id 
 ORDER BY id 

可以创建一个存储函数来生成select语句,该语句将根据表的当前值生成动态结果,例如

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION Get_Pivoted_States RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
  v_cols      VARCHAR2(32767);
BEGIN
  SELECT LISTAGG('MAX(CASE WHEN rn = '||rn||' THEN State_Assign END) AS sa'||rn ,',') 
          WITHIN GROUP (ORDER BY 0)        
    INTO v_cols
    FROM (SELECT DISTINCT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn 
            FROM sampledata);

  v_sql :='SELECT id,
                  '|| v_cols ||',
                  COUNT(*) AS total
             FROM (SELECT s.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY 0) AS rn 
                     FROM sampledata s)
            GROUP BY id 
            ORDER BY id';

  OPEN v_recordset FOR v_sql;
  DBMS_OUTPUT.PUT_LINE(v_sql);
  RETURN v_recordset;
END;
/

可以从SQL开发人员控制台调用该函数,如下所示

代码语言:javascript
复制
SQL> DECLARE
    result SYS_REFCURSOR;
BEGIN
   :result := Get_Pivoted_States;
END;
/

SQL> PRINT result; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67383972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档