需要帮助将行转换为 Oracle SQL 查询中的列

Need help transposing rows to columns in Oracle SQL query

我在 Oracle 数据库中有 2 个不同的数据源。这只是与 Oralce DB 的 SQL 连接(不是 PL SQL)。

第一个来源是一个应用程序 table,它有一个应用程序 ID 和大量属性 第二个来源是 table 联系人。每个联系人都有一个应用 ID (logical_name)、一个类型、一个联系人、一个电子邮件和一些其他属性。

我想将它们放在 table 的目标位置

我在此处搜索并根据所学知识最终尝试将我的应用 table 加入此子查询:

select 
max(logical_name) logical_name,
MAX(CASE WHEN type='APPLICATION SUPPORT OWNER' THEN contact END) Application_Support_Owner,
MAX(CASE WHEN type='APPLICATION SUPPORT OWNER' THEN email END) App_Support_Owner_EMAIL,
MAX(CASE WHEN type='APPLICATION SUPPORT - PRIMARY' THEN contact END) Application_Support_Primary,
MAX(CASE WHEN type='APPLICATION SUPPORT - PRIMARY' THEN email END) App_Support_Primary_EMAIL,
MAX(CASE WHEN type='BUSINESS CONTACT - PRIMARY' THEN contact END) Business_Contact_Primary,
MAX(CASE WHEN type='BUSINESS CONTACT - PRIMARY' THEN email END) Business_Contact_Primary_EMAIL

from contact_table
group by logical_name

我在查看输出时发现,在某些情况下,存在不止一个特定类型的联系人(尽管名称如“主要”和“所有者”)。因为联系人是“Last, First”格式,而电子邮件是 First.Last@company.com,Max 函数正在混合和匹配联系人和电子邮件。

我认为对于多个值的最佳答案只是从一条记录中获取联系人和电子邮件,然后丢弃另一条记录。它更简单,我们真的只需要每个角色(即每种类型)的一个联系人。

我有点 SQL 菜鸟。除了 Max() 之外,是否有我可以使用的函数或可以从同一记录中产生两个字段的不同语法?我只想要每个应用程序的一行数据,因此我的连接没有每个应用程序的多条记录。预先感谢您的帮助。

使用 KEEP 和聚合函数关联聚合:

select max(logical_name) logical_name,
       MAX(CASE WHEN type='APPLICATION SUPPORT OWNER' THEN contact END)
         AS Application_Support_Owner,
       MAX(CASE WHEN type='APPLICATION SUPPORT OWNER' THEN email END)
         KEEP(
           DENSE_RANK LAST
           ORDER BY CASE WHEN type='APPLICATION SUPPORT OWNER' THEN contact END NULLS FIRST
         ) AS App_Support_Owner_EMAIL,
       MAX(CASE WHEN type='APPLICATION SUPPORT - PRIMARY' THEN contact END)
         AS Application_Support_Primary,
       MAX(CASE WHEN type='APPLICATION SUPPORT - PRIMARY' THEN email END)
         KEEP(
           DENSE_RANK LAST
           ORDER BY CASE WHEN type='APPLICATION SUPPORT - PRIMARY' THEN contact END NULLS FIRST
         ) AS App_Support_Primary_EMAIL,
       MAX(CASE WHEN type='BUSINESS CONTACT - PRIMARY' THEN contact END)
         AS Business_Contact_Primary,
       MAX(CASE WHEN type='BUSINESS CONTACT - PRIMARY' THEN email END)
         KEEP(
           DENSE_RANK LAST
           ORDER BY CASE WHEN type='APPLICATION SUPPORT - PRIMARY' THEN contact END NULLS FIRST
         ) AS Business_Contact_Primary_EMAIL
from     contact_table
group by logical_name;