首页 > 解决方案 > 使用 SQL 将相关表展平为多列

问题描述

我正在尝试使用 SQL 从 IFS 数据库(Oracle 后端)中的两个表中精确数据。一个表包含地址列表,另一个包含这些地址具有的类型。

例子:

地址表:

Address1
Address2

地址类型

Address1, DELIVERY, TRUE
Address1, DOCUMENT, FALSE
Address1, PAY, FALSE
Address2, DELIVERY, FALSE
Address2, PAY, TRUE

我可以编写一个成功获取地址及其类型的查询,但我最终会为每种地址类型创建一个新行(本质上它看起来就像AddressType表格)。

SELECT 
    a.address_ID,
    at.address_type,
    at.address_type_default_b
FROM
    addresses a,
    address_type at
WHERE
    a.address_ID = at.address_ID

我想要的是一个将“展平”表格的查询,将每种类型移动到一列中。根据上面的示例,结果表将有 2 行,4 列,见下文。

期望的结果

Address1, TRUE, FALSE, FALSE
Address2, FALSE,*NULL*,TRUE

请注意,我不关心 Null、空白、NA 或 NULL 的含义

任何帮助将非常感激。我意识到我可以在 excel 中执行此操作,但考虑到数据的大小和我必须执行此操作的次数,在 SQL 中执行此操作会很好。

对不起,问题的格式很差......我不知道如何插入表格或让我的 sql 看起来正确。

标签: sql

解决方案


假设您的地址只有 3 个状态,并且每个状态只能发生一次:

如果您没有任何值,它将根据需要返回 null

select a.address_ID,max( case when address_type='Delivery' then address_type_default_b end  ) 
,max( case when address_type='Document' then address_type_default_b end  )
,max( case when address_type='Pay' then address_type_default_b end  )
from address_table a
left join addresstype_table at on a.address_ID=b.address_ID
group by a.address_ID

推荐阅读