基于要在多个值上进行大写的汇总行生成一个值?

问题描述 投票:4回答:3

我有以下表格的表格:

| 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

但是这似乎是一种混乱的方式,因为当我真正在做的是集合比较时,没有真正的理由使用字符串聚集。有更好的方法吗?

sql sql-server
3个回答
1
投票

假定只是一个吃肉的人,不管其他人可能不吃什么,都是杂食动物,而一个吃动物副产品(而不是肉)的人是素食主义者,那么你可以做这样的事情:] >

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;

1
投票

您可以使用条件聚合来处理值的层次结构:


0
投票

您也可以只使用聚合而不使用CASE

© www.soinside.com 2019 - 2024. All rights reserved.