【问题标题】:Rows into Columns Oracle pl sql [duplicate]行成列Oracle pl sql [重复]
【发布时间】:2014-10-29 19:11:11
【问题描述】:

我正在使用 oracle 10g pl sql,我想将行转换为列,但列应该是动态的,而不是硬编码的。

select *
from
 "EnumerationValue"
   pivot
    (count("pkEnumerationValueId")
      for "Text" in (select "Text" from "EnumerationValue" where "fkEnumerationId"=6));

我通过搜索找到了这个查询,但它给了我错误。

ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"

然后我就这样尝试了

VARIABLE g_ref REFCURSOR
DECLARE
 v_sql VARCHAR2(32767);
  BEGIN
   v_sql := 'select "Text"';
   FOR rec IN
     (select "Text" from "EnumerationValue" inner join "Enumeration" on "Enumeration"."pkEnumerationId"="EnumerationValue"."fkEnumerationId"
   where "EnumTable"='Vehicle Model')
   LOOP
     v_sql := v_sql
           || ',sum(case when "Text" is not null then 1 else 0)' || rec."Text";
    END LOOP;
  v_sql := v_sql
         || ',"pkEnumerationValueId" from "EnumerationValue" group by "Text","pkEnumerationValueId"';
 OPEN :g_ref FOR v_sql;
 END;

它给了我错误

ORA-00905: missing keyword
ORA-06512: at line 14
00905. 00000 -  "missing keyword"

我的表格列是“文本”,其中包含“铃木”、“法拉利”、“本田”、“福特”等值,并且可以更多(用户可以插入新值)。 所以我想要这样的结果。

Model        Suzuki        Ferrari     Honda      Ford   ........

2000           1              0          0          0
2001           5              2          5          0
2002           9              12         3          2

【问题讨论】:

  • 不,绝对不是!!它没有在那里回答。答案包含硬编码值,如果你能看到描述,我希望它是动态的。谢谢。

标签: oracle plsql


【解决方案1】:

您应该删除以前的数据库并构建一个新数据库以解决此问题

【讨论】:

  • 很抱歉我问了一个可能很愚蠢的问题,但是……这将如何解决他的问题?
  • 如果你认识另一个人,它可能:)
【解决方案2】:

回答你的问题

  1. Oracle 直到 11G 才支持 PIVOT/UNPIVOT。
  2. 你不能让它完全动态来实现转置/旋转

【讨论】:

    【解决方案3】:

    根据Oracle SQL Reference:“子查询仅与 XML 关键字结合使用。”

    换句话说:如果不获取 XML 输出,就无法在静态 SQL 中创建完全动态的、基于枚举表的旋转查询。

    可以做的是,在第二次尝试中使用动态 SQL,在第一次尝试中使用 pivot 子句,并使用“硬编码”值动态构建 pivot for ... in ... 子句.

    【讨论】:

    • 我确实试过@nop77svk。我最后的手段是制作一个临时表并使用我的行名创建列。因为oracle不支持这种东西。
    • 相信我,它有效,我昨天在我的项目中做到了。使用动态“硬编码”值构建旋转选择并通过execute immediateopen cursor for ... 执行它可以解决您的问题。不幸的是,我无法向您展示您生成的代码,因为我没有时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多