2014-10-29 65 views
1

我正在使用oracle 10g pl sql,我想将行转换为列,但列应该是动态的而不是硬编码的。行转换为列Oracle 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 
+0

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

回答

1

您应该删除以前的数据库,以便建立一个新的数据库来解决这个问题

+3

对不起,我问一个潜在的愚蠢问题,但是......这将如何解决他的问题? – nop77svk 2014-10-29 11:25:32

+0

如果你认识别人,那可能:) – SriniV 2014-10-29 14:09:16

1

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

换句话说:您无法在静态SQL中生成完全动态的,基于列表的基于枚举表的旋转查询,而无法获取XML中的输出。

什么可以你这样做,是使用动态SQL作为您与pivot条款第二次尝试在你的第一次尝试,以“硬编码”值动态建立你pivot for ... in ...条款。

+0

我曾尝试过@ nop77svk。我最后的手段是制作临时表并使用我的行的名称创建列。因为oracle不支持这种事情。 – 2014-10-29 10:47:39

+0

相信我,它的工作原理,我昨天在我的项目上做了。使用动态“硬编码”值构建一个pivot选择,并通过“execute immediate”或“打开光标...”来执行它将解决您的问题。不幸的是,我无法向您显示您的结果代码,因为我没有时间。 – nop77svk 2014-10-29 11:12:57

1

要回答你的问题

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