我有以下表格的表格:
| PersonId | Eats |
|----------|-------------------|
| 1 | Meat |
| 1 | Animal Byproducts |
| 1 | Vegetables |
| 2 | Animal Byproducts |
| 2 | Vegetables |
| 3 | Vegetables |
而且我想把它变成像这样的表:
| PersonId | DietaryPreference |
|----------|--------------------|
| 1 | Omnivore |
| 2 | Vegetarian |
| 3 | Vegan |
我最初的想法是做类似的事情
WITH cte AS (
SELECT
PersonId,
STRING_AGG (Eats,',') WITHIN GROUP (ORDER BY Eats ASC) AS EatsConcat
FROM MyTable
GROUP BY PersonId
)
SELECT
PersonId,
CASE EatsConcat
WHEN 'Animal Byproducts,Meat,Vegetables' THEN 'Omnivore'
WHEN 'Animal Byproducts,Vegetables' THEN 'Vegetarian'
WHEN 'Vegetables' THEN 'Vegan'
END AS DietaryPreference
FROM cte
但是这似乎是一种混乱的方式,因为当我真正在做的是集合比较时,没有真正的理由使用字符串聚集。有更好的方法吗?
假定只是一个吃肉的人,不管其他人可能不吃什么,都是杂食动物,而一个吃动物副产品(而不是肉)的人是素食主义者,那么你可以做这样的事情:] >
WITH CTE AS(
SELECT V.PersonID,
COUNT(CASE V.Eats WHEN 'Meat' THEN 1 END) AS Meat,
COUNT(CASE V.Eats WHEN 'AnimalByproducts' THEN 1 END) AS AnimalByproducts,
COUNT(CASE V.Eats WHEN 'Vegetables' THEN 1 END) AS Vegetables
FROM (VALUES(1,'Meat'),
(1,'AnimalByproducts'),
(1,'Vegetables'),
(2,'AnimalByproducts'),
(2,'Vegetables'),
(3,'Vegetables'))V(PersonID,Eats)
GROUP BY V.PersonID)
SELECT C.PersonID,
CASE WHEN C.Meat > 0 THEN 'Omnivore'
WHEN AnimalByproducts > 0 THEN 'Vegetarian'
WHEN Vegetables > 0 THEN 'Vegan'
ELSE 'Very hungry'
END
FROM CTE C;
您可以使用条件聚合来处理值的层次结构:
您也可以只使用聚合而不使用CASE
。