仅从表中的多个字段返回异常

Posted

技术标签:

【中文标题】仅从表中的多个字段返回异常【英文标题】:Only return exceptions from multiple fields in a table 【发布时间】:2020-08-27 06:50:25 【问题描述】:

我有存储零售交易的表(交易)。我希望能够找到几个字段的独特组合。我有一个存储交易类型(在线或商店)和客户姓名、周数和产品类型的表。我需要找到共享相同客户、周和产品的在线或商店交易,但前提是没有来自其他交易类型的相应交易。请参阅下面的示例...

+------------------+---------+------+------------ --+ |交易类型 |客户 |周 |产品_类型 | +------------------+---------+------+------------ --+ |在线 | 123 | 1 |服装 | +------+---------+------+------------ --+ |商店 | 123 | 1 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 123 | 1 |家居用品 | +------+---------+------+------------ --+ |在线 | 123 | 2 |服装 | +------+---------+------+------------ --+ |商店 | 123 | 2 |服装 | +------------------+---------+------+------------ --+ |在线 | 123 | 2 |体育 | +------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |商店 | 345 | 2 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |家居用品 | +------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |商店 | 345 | 2 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |体育 | +------+---------+------+------------ --+

从这里我想看到以下返回...

+------------------+---------+------+------------ --+ |交易类型 |客户 |周 |产品_类型 | +------------------+---------+------+------------ --+ |在线 | 123 | 1 |服装 | +------+---------+------+------------ --+ |在线 | 123 | 2 |服装 | +------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |服装 | +------------------+---------+------+------------ --+ |商店 | 345 | 2 |家居用品 | +------------------+---------+------+------------ --+ |在线 | 345 | 2 |体育 | +------------------+---------+------+------------ --+

其他交易被排除在外,因为 Online 和 Store 的 customer、week 和 product_type 值相同。

我目前的代码是这样的......

select * from transactions
group by customer, week, product_type
having count(customer, week, product_type) <> 2

但我认为我应该使用分区,但我不知道如何。

谢谢

【问题讨论】:

【参考方案1】:

你可以使用not exists:

select t.*
from transactions t
where not exists (
    select 1
    from transactions t1
    where 
        t1.customer = t.customer
        and t1.week = t.week
        and t1.product = t.product
        and t1.transaction_type <> t.transaction_type
)

【讨论】:

以上是关于仅从表中的多个字段返回异常的主要内容,如果未能解决你的问题,请参考以下文章

Swift:仅从表中的某些行/部分中分离

访问:如何从表中检索某个字段并返回?

仅从表中选择一些列

仅从表中选择最新记录并使其快速,如何?

SQL Server 2008 仅从字段中选择日期 [重复]

SQL - 仅从表中获取并非所有值都是空值的列