如何检查客户是否提出了保修索赔和产品销售?

时间:2021-02-18 07:23:53

标签: sql postgresql

我想知道如何检查 PostgreSQL 以查看客户是否同时提出了保修索赔和产品销售。

例如,我有一个这样的客户。

<头>
CustomerID OrderID 产品名称
ABC123 1426457 产品 A
ABC123 1426458 保修声明

所以对于这个客户。我想将一列设置为 true 表示他/她同时包含产品销售和保修索赔。

鉴于这样的客户

<头>
CustomerID OrderID 产品名称
DEF456 1426990 产品 A
DEF456 1427500 产品B

我想将一列设置为 false,因为他/她没有保修索赔。

客户是否下了两个以上的订单并不重要。只要有保修索赔和产品销售,我就想将其设置为 true。

这可能吗?到目前为止,我已经尝试了各种使用 SQL 的解决方案,但都无济于事。

预期输出:

<头>
CustomerID OrderID 产品名称 布尔
ABC123 1426457 产品 A TRUE
ABC123 1426458 保修声明 TRUE
<头>
CustomerID OrderID 产品名称 布尔
DEF456 1426990 产品 A
DEF456 1427500 产品B

1 个答案:

答案 0 :(得分:1)

demos:db<>fiddle

SELECT
    "CustomerID",
    bool_or("Product Name" = 'WARRANTY CLAIM')
        AND
    bool_or("Product Name" != 'WARRANTY CLAIM')
FROM mytable
GROUP BY "CustomerID"

通过在 bool_or() 上使用 CustomerID 进行聚合并检查 Product Name 是否为 WARRENTY CLAIM,您将预期结果作为聚合返回。因此,一项检查应该是至少有一个 WARRENT CLAIM 并且至少有一个没有。


如果你想在每条记录上都得到这个,你可以使用 bool_or() window function:

SELECT
    *,
    bool_or("Product Name" = 'WARRANTY CLAIM') OVER (PARTITION BY "CustomerID")
        AND
    bool_or("Product Name" != 'WARRANTY CLAIM') OVER (PARTITION BY "CustomerID")
FROM mytable