2

複数列のテーブルの単一の列に基づいて重複を削除およびマージして、「垂直サマリー」を作成する方法を知っている人はいますか。

IE)テーブル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はすべての列でそうするためですが、私は異なる人の名前だけが必要です。

私が頭の中で考えていたもう1つのオプションは、人の名前と英語、フランス語、中国語の空の列だけが入力されたテーブルを作成することでした。次に、updateステートメントを使用して、表Aとの照合を介してそれらにデータを入力します。

誰かがより良い方法/私がこれを実装する方法を知っていますか?私はまだOracleの学習の初期段階にあり(特にループに関して)、助けていただければ幸いです。

ありがとう!

4

3 に答える 3

3

Oracle にはデコード機能があります。

しかし、あなたが探しているのはピボットです

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
);
于 2012-07-13T11:14:20.400 に答える
0

これを試して

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
于 2012-07-13T11:17:55.557 に答える
0

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、ビューを作成して、ずれないようにすることをお勧めします。

于 2012-07-13T11:36:54.307 に答える