【问题标题】:Merge multiple rows (with same ID) into one?将多行(具有相同ID)合并为一行?
【发布时间】:2020-01-23 17:29:10
【问题描述】:

我希望将多行合并为具有匹配 ID 的一行。我正在使用 Teradata SQL。 示例:

  SELECT
  id_nbr AS ID,
  contact_type AS contype,
  contact_first_name AS firstName,
  contact_last_name AS lastName,
  contact_phone_number AS phoneNumber,
  contact_address AS address,
  contact_email AS email
  FROM database.account_info
  WHERE (contact_type = 'AAA' OR contact_type = 'BBB' OR contact_type = 'CCC');

结果:

ID          contype     firstName     lastName    phoneNumber     address        email
111111111   AAA         bob           smith       (999)999-9999   1 Main St      null
111111111   BBB         bob           smith       (888)888-8888   1 random rd    bob@random.com
111111111   CCC         bob           smith       null            null           bob@anotherrandom.com

我想要什么:

ID          contypeAAA     firstNameAAA     lastNameAAA    phoneNumberAAA     addressAAA      emailAAA   contypeBBB  firstNameBBB     lastNameBBB    phoneNumberBBB     addressBBB      emailBBB  contypeCCC     firstNameCCC     lastNameCCC    phoneNumberCCC     addressCCC      emailCCC
111111111   AAA            bob              smith          (999)999-9999      1 Main St       null ......etc

这甚至可能吗?这将极大地帮助我..!提前致谢!

编辑此,ID 的 contype 并不总是具有所有 3 个 contype。这使它变得更加棘手。例如,ID: 99999999 只能有 contype: 'AAA','BBB' 但应该为所有 'CCC' 值返回空值,因为它不存在。

【问题讨论】:

  • 最简单的方法是两个自连接。每个联系人类型是否始终存在行,或者是否存在始终存在的联系人类型?
  • 每个 ID 并不总是有一个联系人类型,但最多可以有三种不同的(AAA、BBB、CCC)。
  • 是否只有 3 个潜在值(整个表),每个 id 最多有 3 个?
  • 没有 8 个,但我需要这 3 个(如果每个 ID 都存在)。
  • 使用枢轴,应该这样做

标签: sql teradata


【解决方案1】:

我相信这会起作用(我在 Oracle 11g 上测试过,而不是 Teradata):

SELECT *
  FROM (SELECT id_nbr AS ID,
               contact_type AS contype,
               contact_first_name AS firstName,
               contact_last_name AS lastName,
               contact_phone_number AS phoneNumber,
               contact_address AS address,
               contact_email AS email
          FROM database.account_info
         WHERE contact_type in ('AAA', 'BBB', 'CCC')
        )
 PIVOT (max(firstName) AS firstName,
        max(lastName) AS lastName,
        max(phoneNumber) AS phone,
        max(email) AS email,
        max(address) AS address
   FOR contype IN ('AAA', 'BBB', 'CCC')
        )

最后一行可能需要一个别名,以下之一:

        ) AS derived_pivot
        ) derived_pivot

【讨论】:

  • 非常感谢您的回答 :) 稍后我可以测试一下!
  • @JCP 一旦你测试了 SQL,请接受我的回答。当然,除非它不起作用。
  • 您只需要添加 aliases,Oracle 支持省略它们,Standard/Teradata SQL 不支持:) ) as dt
  • Oracle 在标准 SQL 的 AS 上窒息,但不是列别名,只有 Larry 知道,为什么 :-)
  • @Scratte 谢谢!最终,您的解决方案帮助我解决了我的问题。非常感谢您的宝贵时间:)
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 2013-05-24
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2015-11-08
  • 2023-03-08
  • 2012-11-04
相关资源
最近更新 更多