【问题标题】:How to reshape a Teradata table from long to wide format without aggregation?如何在不聚合的情况下将 Teradata 表从长格式重塑为宽格式?
【发布时间】:2021-11-16 07:22:10
【问题描述】:

虽然在回答有关将长表转换为宽格式的各种问题时提供了使用 Teradata 的 PIVOT 函数,但这些建议涉及使用聚合函数,即 PIVOT 的一个参数。
有没有办法在聚合的情况下重塑/旋转数据?

这样的表可以吗...

Initial Name
A Abel
A Adriana
A Alberto
B Billy
B Bob
C Carla
C Carlos
C Cesar
C Cristina

...变成下面?

Initial Name1 Name2 Name3 Name4
A Abel Adriana Alberto
B Billy Bob
C Carla Carlos Cesar Cristina

这是我用于在 Teradata 16.20 中创建第一个表的代码:

CREATE VOLATILE TABLE MyTab (Initial varchar(1), "Name" varchar(10))
UNIQUE PRIMARY INDEX(Initial, "Name") ON COMMIT PRESERVE ROWS;

INSERT INTO MyTab values ('A','Abel');
INSERT INTO MyTab values ('A','Adriana');
INSERT INTO MyTab values ('A','Alberto');
INSERT INTO MyTab values ('B','Billy');
INSERT INTO MyTab values ('B','Bob');
INSERT INTO MyTab values ('C','Carla');
INSERT INTO MyTab values ('C','Carlos');
INSERT INTO MyTab values ('C','Cesar');
INSERT INTO MyTab values ('C','Cristina');

SELECT * FROM MyTab ORDER BY Initial, "Name";

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    如果知道列数,可以使用条件聚合:

    select initial,
           max(case when seqnum = 1 then name end) as name1,
           max(case when seqnum = 2 then name end) as name2,
           max(case when seqnum = 3 then name end) as name3,
           max(case when seqnum = 4 then name end) as name4
    from (select t.*,
                 row_number() over (partition by initial order by name) as seqnum
          from mytab t
         ) t
    group by initial;
    

    【讨论】:

    • 太棒了!谢谢你。由于我不知道列数,我想我必须使用另一种语言来动态确定列数并生成一个字符串来表示查询。
    • @MCornejo 。 . .没错。
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2021-10-26
    相关资源
    最近更新 更多