sql - 无论顺序如何,计算多列中值的唯一组合?

标签 sql db2

我有一个看起来有点像这样的表:

Customer_ID | Offer_1 | Offer_2 | Offer_3
------------|---------|---------|--------
111         | A01     | 001     | B01
222         | A01     | B01     | 001
333         | A02     | 001     | B01

我想编写一个查询来计算表中有多少独特的报价组合,无论报价以什么顺序出现。

因此,在上面的示例中,有两个独特的组合:客户 111 和 222 都有相同的三个优惠,因此它们被视为一个独特的组合,然后客户 333 是唯一拥有三个订单的客户。所以查询的期望输出是 2。

对于一些额外的上下文:

  • customer_ID 列是整数格式,所有的offer 列采用 varchar 格式。
  • 实际有12个offer列,超过300万行 表,在报价列中有 100 多个不同的值。我 简化了示例以更好地说明我正在尝试做的事情,但是任何解决方案都需要扩展到这个数量 可能的组合。

我可以将所有优惠列连接在一起,然后对结果运行 count distinct 语句,但这不考虑具有相同独特优惠组合但订购方式不同的客户(例如客户 111 和 222 中的上面的例子)。

请问有人知道如何解决这个问题吗?

最佳答案

假设字符 / 没有出现在任何优惠名称中,您可以这样做:

select count(distinct offer_combo) as distinct_offers
from (
  select listagg(offer, '/') within group (order by offer) as offer_combo
  from (
    select customer_id, offer_1 as offer from t
    union all select customer_id, offer_2 from t
    union all select customer_id, offer_3 from t
  ) x
  group by customer_id
) y

结果:

DISTINCT_OFFERS
---------------
2

查看 db<>fiddle 的运行示例。

关于sql - 无论顺序如何,计算多列中值的唯一组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70988906/

相关文章:

java - SQL语句大概运行,没有错误,但断言失败

mysql - 如何在 SQL 中的行中查找重复项?

sql - DB2 使用序列号进行更新,但仅在条件发生时增加

database - 数据压缩定义

mysql - 是否可以在列大小不匹配的情况下创建外键

sql - 无法在小数列 SQL 中插入 int 值

sql - 如何阻止身份列中出现 13 的倍数

database - 哪个更好 ?具有更快数据访问的冗余,或者没有冗余和更慢的数据访问

linux - 在 Linux 服务器上通过 Informatica Power Center 读取 DB2 数据时出现问题

database - 在 dbcp2.BasicDataSource 中配置 SSL