是否有人知道如何根据多列表的单个列删除和合并重复项以创建“垂直摘要”。
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在所有列中都是如此,但我只想要不同的人名。
我脑子里想到的另一个选择是创建一个只填充人名和空栏英文,法文和中文的表格。然后使用update语句通过匹配表A来填充它们。
有没有人知道更好的方式/如何实现这一点。我仍处于学习Oracle的早期阶段(特别是关于循环),我们将非常感谢任何帮助。
谢谢!
答案 0 :(得分:3)
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
);
答案 1 :(得分: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
答案 2 :(得分:0)
使用pivot与Sjuul相同,但这会为您提供所需的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
视图设为一个视图,这样就不会失败。