甲骨文SQL;确定值在组中是否唯一

Oracle SQL; Determine if value is unique or not in a group

我很苦恼,直到今天还没有找到解决办法。 我需要确定产品组是混合的还是唯一的。

条件:

  1. If all SKU's in Pallet have product group LAMINAAT -> LAM
  2. If all SKU's in Pallet have product group ACCESSORIE -> ACC
  3. If it is a mix of LAMINAAT and ACCESSORIE -> MIX
  4. As soon as 1 SKU has a product group ≠ LAMINAAT or ACCESSORIE -> Leave this field blank

我当前 select 语句的结果给出以下结果:

ORDER_ID,    PALLET_ID,              SKU_ID,    PRODUCT_GROUP
80081876    00257084646912345679    9410-3798   ACCESSORIE
80081876    00257084646912345679    9420-3012   ACCESSORIE
80081876    00257084646912345679    9410-3012   ACCESSORIE
80081876    00257084646912345679    9410-3010   ACCESSORIE
80081876    00257084646912345678    9420-3865   ACCESSORIE
80081876    00257084646912345678    9410-3857   ACCESSORIE
80081876    00257084646912345678    9420-3010   ACCESSORIE
80081876    00997084646920000197    3010-3798   LAMINAAT
80081876    00280120160000000001    9420-3853   ACCESSORIE
80081876    00280120160000000001    9420-3895   ACCESSORIE
80081876    00280120160000000001    9320-3853   LAMINAAT
80081876    00280120160000000001    9420-3798   ACCESSORIE

数据结果集应该是:

Pallet id                    product group
00257084646912345679          ACC
00280120160000000001          MIX 
00997084646920000197          LAM

我在想这段代码

WITH  cte AS
(SELECT pallet_id,
  COUNT(DISTINCT PRODUCT_GROUP) AS counter
FROM product_group_data
GROUP BY pallet_id
)
SELECT p.pallet_id,
        p.PRODUCT_GROUP, 
        CASE WHEN c.counter = 1 
              THEN SUBSTR(p.PRODUCT_GROUP,1,3) 
              ELSE 'MIX' 
        END uniq
FROM product_group_data p
JOIN cte c
  ON p.pallet_id = c.pallet_id

这涵盖了标准的 1、2、3..遗憾的是不是 4.

欢迎任何想法

谢谢

您可以使用条件聚合根据 product_group

的成员分配新标签
select pallet_id,
    case 
        when count(case when product_group not in ('LAMINAAT','ACCESSORIE') then 1 end) > 0 then ''
        when count(distinct product_group) > 1 then 'Mix'
        when count(case when product_group = 'LAMINAAT' then 1 end) > 0 then 'LAM'
        else 'ACC'
    end as label
from mytable
group by pallet_id