根据结果​​和案例陈述进行分组

时间:2019-01-30 19:14:34

标签: sql sql-server group-by case case-statement

enter image description here

为此我真的无法拿出一个好标题。 我在第一张图片中有数据。 如果此人有蓝色或绿色,则我希望查询在一行中将“人”作为一列返回,然后在第二列中返回“是”(我可以使用case语句执行该步骤)。 如果此人具有所有其他颜色,我希望它在第二栏中返回该人的姓名和“否”。 分组依据很重要,因为我只希望人们在第二栏中显示一次“是”(如果他们有蓝色或绿色,否则显示“否”)。

How the results should look

enter image description here

3 个答案:

答案 0 :(得分:0)

很多方法,但是由于您似乎想使用GROUP BY和CASE,因此您可以做的是在颜色为蓝色或绿色THEN 1时得到CASE的最大值,否则为0。

这将给您每个名称一个1或0,然后您可以使用另一个CASE或REPLACE将1更改为“是”,将0更改为“否”。

另一种可能更高效,更易于读取/维护的方法是选择DISTINCT名称,然后使用相关子查询对EXISTS()进行一次CASE WHEN检查是否存在该名称的记录以及蓝色或绿色。存在时(...)然后为“是”,否则为“否”。

答案 1 :(得分:0)

请参见以下使用common table expression的方法。这将返回预期结果

;WITH YES_RES AS
(
    SELECT DISTINCT PERSON, 'YES' AS RES FROM tabname
    WHERE COLOR IN ('Blue', 'Green')
),
NO_RES AS
(
    SELECT DISTINCT PERSON, 'NO' AS RES FROM tabname
    WHERE PERSON NOT IN (SELECT DISTINCT PERSON FROM YES_RES)
)
SELECT PERSON, RES FROM YES_RES
UNION
SELECT PERSON, RES FROM NO_RES

答案 2 :(得分:0)

我将使用条件聚合:

select person,
       (case when sum(case when color in ('blue', 'green') then 1 else 0 end) > 0
             then 'Yes' else 'No'
        end) as flag
from t
group by person