2013-04-06 99 views
0

我需要帮助创建交叉表。 我被告知可以使用Merge语句来完成,但是我对此感到非常困惑。 也许有人有过使用合并语句创建交叉表的过程。Oracle SQL使用合并创建交叉表

这里是初始表: (有可能是在初始表和结果表中的列多人)

person text 
person_1 some_text_1 
person_1 some_text_2 
person_1 some_text_3 
person_1 some_text_4 
person_1 some_text_5 
person_2 some_text_6 
person_2 some_text_7 
person_2 some_text_8 
person_2 some_text_9 

而且表我需要的结果是:

person_1 person_2 
some_text_1 some_text_6 
some_text_2 some_text_7 
some_text_3 some_text_8 
some_text_4 some_text_9 
some_text_5 

UPD:我知道这可以用pivot或smth来完成。 问题是如何使用MERGE来做到这一点。

+0

组合尝试做为什么你已经什么试图让你感到困惑?你能发布你的代码和你不明白的解释吗? – Ben 2013-04-06 22:28:50

+1

我不认为MERGE声明是您想要使用的。将基于标准执行有条件的插入/更新。 – OldProgrammer 2013-04-06 22:39:03

+0

>为什么你试过的东西已经使你困惑? 我不知道我应该用什么键链接人员和报告。 '合并到报告 使用(选择的人,本文从者) ON(--on什么条件?) WHEN NOT MATCHED然后插入(我 - 如何可以定义只有一列中插入?) VALUES(TEXT );' – user2253044 2013-04-07 07:57:42

回答

0

我不知道如何使用'合并'。其实,我不认为'合并'可以工作... 这是我的解决方案,它可以满足您的需求,但不方便...

SELECT A.TEXT AS PERSON_1,B.TEXT AS PERSON_2... 
FROM 
(SELECT TEXT,ROWNUM AS R FROM PERSON_TAB WHERE PERSON='person_1') A 
FULL JOIN 
(SELECT TEXT,ROWNUM AS R FROM PERSON_TAB WHERE PERSON='person_2') B 
ON A.R=B.R 
FULL JOIN 
... 

如果你有太多的“人员”,你可以创建一个过程来做到这一点。 请告诉我,如果你已经知道如何使用合并或更好的方法:)

0

我想你可能与RANKPIVOT这样

select person_1,person_2 
from (
     select * 
     from (
       select rank() over(partition by person order by text) as idx, person, text 
       from <your_table> 
      ) 
     pivot (
       max(text) for person in (
         'person_1' as person_1, 
         'person_2' as person_2 
        ) 
      ) 
    )