【问题标题】:Oracle SQL creating crosstab using mergeOracle SQL 使用合并创建交叉表
【发布时间】:2013-03-29 04:44:17
【问题描述】:

我需要帮助创建交叉表。 有人告诉我可以使用 Merge 语句来完成,但我对此感到很困惑。 也许有人有使用合并语句创建交叉表的经验。

这是初始表: (初始表可以有很多人,结果表可以有很多列)

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:我知道它可以通过枢轴或其他方式完成。 问题是如何使用 MERGE 来做到这一点。

【问题讨论】:

  • 为什么你已经尝试过让你感到困惑?你能发布你的代码和你不理解的解释吗?
  • 我不认为 MERGE 语句是你想要使用的。这是根据条件执行有条件的插入/更新。
  • >为什么你的尝试已经让你感到困惑?我不知道应该使用什么键来链接人员和报告。 MERGE INTO REPORT USING (SELECT PERSON, TEXT FROM PERSONS) ON (--on what condition?) WHEN NOT MATCHED THEN INSERT (--how can I define only one column to insert?) VALUES (TEXT);

标签: sql oracle merge crosstab


【解决方案1】:

我不知道如何使用“合并”来获得它。实际上,我认为“合并”行不通... 这是我的解决方案,可以满足您的需求但不方便...

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
...

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

【讨论】:

    【解决方案2】:

    我想你可以试试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
                        )
                )
        )
    

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 2022-12-08
      • 1970-01-01
      • 2013-06-17
      • 2019-05-13
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多