繁体   English   中英

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

[英]Need help transposing rows to columns in Oracle SQL query

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

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

我想将它们放在目标位置的应用程序表中

我在这里搜索并根据我学到的知识最终尝试将我的应用程序表加入这个子查询:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM