【问题标题】:Oracle 11g - Merging single column duplicates to create a vertical summaryOracle 11g - 合并单列重复项以创建垂直汇总
【发布时间】:2012-07-13 05:33:33
【问题描述】:

有谁知道如何根据多列表的单列删除和合并重复项以创建“垂直摘要”。

I.E) 尝试从表 A 构建表 B

Table A:
Person Language
Bob    English
Sarah  French
John   Chinese
Bob    French
Sarah  English
Sarah  Chinese

Table B (RESULT): 
Person English French Chinese 
Bob       Y       Y     (null)
Sarah     Y       Y       Y
John      (null)  (null)  Y

我最初的想法是: 从数据中创建表 A,然后执行以下操作:

Create table summary as 
Select person, (case when language = 'English' then 'Y') as English, (case when        language = 'French' then 'Y') as French, (case when language = 'Chinese' then 'Y') as  Chinese
From Table A;

最后对汇总表进行选择不同。 然而,逻辑是错误的,特别是因为 distinct 在所有列中都这样做,但我只想要不同的人名。

我脑海中想到的另一个选项是创建一个表,其中仅包含不同的人名和空列英语、法语和中文。然后使用更新语句通过匹配表 A 来填充它们。

有没有人知道更好的方法/我如何实现这一点。我仍处于学习 Oracle 的早期阶段(尤其是在循环方面),我们将不胜感激。

谢谢!

【问题讨论】:

    标签: sql oracle merge duplicates distinct


    【解决方案1】:

    Oracle 有一个Decode function

    但是你要找的是pivot

    WITH pivot_data AS (
        SELECT Person, Language
        FROM   A
    )
    SELECT *
    FROM   pivot_data
    PIVOT (
        Count(*)        --<-- pivot_clause
        FOR Language         --<-- pivot_for_clause
        IN  ('English', 'French', 'Chinese')   --<-- pivot_in_clause
    );
    

    【讨论】:

      【解决方案2】:

      试试这个

      Create table summary 
      as  
      Select 
          person, 
          min(case when language = 'English' then 'Y' end) as English, 
          min(case when language = 'French' then 'Y' end) as French, 
          min(case when language = 'Chinese' then 'Y' end) as  Chinese 
      From 
          Table A
      group by 
          person
      

      【讨论】:

        【解决方案3】:

        与 Sjuul 相同的想法,使用 pivot,但这会为您提供您想要的 Y/null 值:

        select * from (
            select person, language, 'Y' as flag from tablea
        )
        pivot (max(flag) for language
            in ('English' as english, 'French' as french, 'Chinese' as chinese));
        

        所以要基于它创建一个新表:

        create table tableb as
        select * from (
            select person, language, 'Y' as flag from tablea
        )
        pivot (max(flag) for language
            in ('English' as english, 'French' as french, 'Chinese' as chinese));
        
        Table created.
        
        select * from tableb order by person;
        
        PERSON          E F C
        --------------- - - -
        Bob             Y Y
        John                Y
        Sarah           Y Y Y
        

        如果tablea 中的数据会发生变化,最好将tableb 设为视图,这样它就不会失步。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-12
          • 1970-01-01
          • 2020-11-23
          • 2018-11-19
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多