如果我有一个包含这样的模式的表
table(Category,SubCategory1,SubCategory2,Status)
我想按类别,SubCategory1进行分组并聚合状态 如果不是该组上的所有状态值都具有特定值,则状态将为0,否则为1。
所以我的结果集看起来像
(类别,子类别1,状态)
我不想写一个函数。我想在查询中做到这一点。
答案 0 :(得分:2)
您可以测试每个组的最小和最大状态是否等于您想要的值:
SELECT
category,
subcategory1,
CASE WHEN MIN(status) = 42 AND MAX(status) = 42 THEN 1 ELSE 0 END AS Status
FROM table1
GROUP BY category, subcategory1
答案 1 :(得分:2)
假设status
是数字数据类型,请使用:
SELECT t.category,
t.subcategory1,
CASE WHEN MIN(t.status) = MAX(t.status) THEN 1 ELSE 0 END AS status
FROM dbo.TABLE_1 t
GROUP BY t.category, t.subcategory1
答案 2 :(得分:0)
假设您要查找状态值低于100
的组SELECT category, subcategory1,
CASE WHEN MAX(status) < 100 THEN 0 ELSE 1 END AS Status
FROM table1
GROUP BY category, subcategory1
状态低于100的所有组都将Status设置为0,并且至少有一个状态&gt; = 100的所有组都将设置为1.
我认为这就是你所要求的,但如果没有让我知道。
答案 3 :(得分:0)
我想按类别分组, SubCategory1并聚合状态 如果不是所有的Status值 超过集团有一定的价值 状态将为0,否则为1。
我将其解释为“如果给定组中的状态值不等于给定参数,则返回的状态将为0,否则为1”。
Select T.Category, T.SubCategory1
, Case
When Exists(
Select 1
From Table As T2
Where T2.Category = T.Category
And T2.SubCategory1 = T.SubCategory1
And T2.Status <> @Param
) Then 0
Else 1
End As Status
From Table As T
Group By t.Category, T.SubCategory1
答案 4 :(得分:0)
类似的东西:
select
Category,
SubCategory1,
(
case
when good_record_count = all_record_count then 1
else 0
end
) as all_records_good
from (
select
t.Category,
t.SubCategory1,
sum( cast(coalesce(t.Status, 'GOOD', '1', '0') as int) ) good_record_count,
count(1) all_record_count
from
table_name t
group by
t.Category, t.SubCategory1
)