GROUP BY子句中的自定义聚合

时间:2010-05-29 19:48:03

标签: sql tsql

如果我有一个包含这样的模式的表

table(Category,SubCategory1,SubCategory2,Status)

我想按类别,SubCategory1进行分组并聚合状态 如果不是该组上的所有状态值都具有特定值,则状态将为0,否则为1。

所以我的结果集看起来像

(类别,子类别1,状态)

我不想写一个函数。我想在查询中做到这一点。

5 个答案:

答案 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
  )