甲骨文SQL;确定值在组中是否唯一
Oracle SQL; Determine if value is unique or not in a group
我很苦恼,直到今天还没有找到解决办法。
我需要确定产品组是混合的还是唯一的。
条件:
- If all SKU's in Pallet have product group LAMINAAT -> LAM
- If all SKU's in Pallet have product group ACCESSORIE -> ACC
- If it is a mix of LAMINAAT and ACCESSORIE -> MIX
- 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
我很苦恼,直到今天还没有找到解决办法。 我需要确定产品组是混合的还是唯一的。
条件:
- If all SKU's in Pallet have product group LAMINAAT -> LAM
- If all SKU's in Pallet have product group ACCESSORIE -> ACC
- If it is a mix of LAMINAAT and ACCESSORIE -> MIX
- 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