我需要执行group by,但仅限于满足条件的行,否则返回所有不符合条件的行。例如,在下表中,我只想对“active”字段中包含“1”的行进行分组,并返回所有不包含“1”的行。
TABLE(id,label,active):
1, A, 1
2, A, 1
3, B, 0
4, B, 0
会回来:
1, A, 1
3, B, 0
4, B, 0
答案 0 :(得分:3)
这是我能想到的最简单的方法。这是该组中的案例陈述。如果满足条件,则按标签分组,否则按主键分组。
SELECT id, label, active
FROM table
GROUP BY
CASE
WHEN active = 1 THEN active
ELSE id END
如果您想按活动分组并标记:
SELECT id, label, active
FROM table
GROUP BY
CASE
WHEN active = 1 THEN active
ELSE id END,
label
编辑:我误解了你要分组的字段。现已更正。
答案 1 :(得分:0)
您可以使用CASE声明
select min(id) as id, label, active
from (
select id, label, active,
case
when active = 1 then 'active'
else convert(varchar,newid()) as discriminator
end
from table) t
group by label, active, discriminator
这将为符合条件的所有行(active = 1)提供一个公共值,为所有其他行提供一个唯一值,以便它们保持未组合状态。
我目前无法访问SQL服务器,所以这是完全未经测试的。
答案 2 :(得分:0)
查询的布局可能是这样的:
select
min(id),
label,
max(active)
from
Foo
where
active = 1
group by
label
union
select
id,
label,
active
from
Foo
where
active = 0