【问题标题】:SQL using count in case statementSQL 在 case 语句中使用 count
【发布时间】:2017-04-12 11:07:25
【问题描述】:

我正在尝试对计数小于 5 的所有活动进行分组(出于数据共享原因)。

ID 代码和 ID 名称给了我高级数字,但只要我包含“商店代码”,我就会得到一些低级数字,这些数字是为那些去奇怪商店一两次的顾客提供的。

Select  Count(*) [Activity],
        T.[ID Code],
        T.[ID Name],
        Case when Count(*) < 6 then 'Other Shop' Else T.Shop End [Shop Code]
From    MyTable T
Group By T.[ID Code],
         T.[ID Name],
         Case when Count(*) < 6 then 'Other Shop' Else T.Shop End

但显然我不能在 case 语句中使用计数。我已经尝试了一些类似问题的解决方案,但没有一个有效!

谢谢

【问题讨论】:

  • case 表达式,而不是语句。

标签: sql count group-by case


【解决方案1】:

问题是GROUP BY:

Select  Count(*) as [Activity],
        T.[ID Code],
        T.[ID Name],
        (Case when Count(*) < 6 then 'Other Shop' Else T.Shop
         End) as [Shop Code]
From    MyTable T
Group By T.[ID Code],
         T.[ID Name];

聚合函数(或带有聚合的表达式)不属于GROUP BY。这些在SELECT计算,不用于定义组。

【讨论】:

    【解决方案2】:

    您可以使用HAVINGUNION ALL 语句,如下所示:

    Select  Count(*) as [Activity],
        T.[ID Code],
        T.[ID Name],
        'Other Shop' [Shop Code]
     From MyTable T
    Group By T.[ID Code],
          T.[ID Name]
    having Count(*) < 6
     union all
    Select  Count(*) as [Activity],
        T.[ID Code],
        T.[ID Name],
        T.Shop [Shop Code]
     From MyTable T
    Group By T.[ID Code],
          T.[ID Name]
    having Count(*) >= 6
    

    【讨论】:

      【解决方案3】:
      select 
      count(*) as activity,
      code,
      name,
      Case when Count(*) < 6 then 'Other Shop' Else shopcode End as shopcode
      from mytable group by code, name ,shopcode
      

      【讨论】:

        【解决方案4】:

        以下示例是 SQL Server 中的测试。

        它使用窗口函数进行计数,以更改商店代码。
        然后将其全部分组,包括修改后的商店代码。

        declare @ShopTable table ([ID Code] varchar(30), [ID Name] varchar(30), Shop varchar(30));
        
        insert into @ShopTable ([ID Code], [ID Name], Shop) values 
        ('S1','Shop 1','AA'),
        ('S1','Shop 1','BB'),
        ('S1','Shop 1','BB'),
        ('S1','Shop 1','CC'),
        ('S1','Shop 1','CC'),
        ('S1','Shop 1','CC'),
        ('S2','Shop 2','XX'),
        ('S2','Shop 2','YY');
        
        select 
        count(*) as [Activity], 
        [ID Code], 
        [ID Name], 
        [Shop Code]
        from (
          select
           [ID Code],
           [ID Name],
           case when count(*) over (partition by [ID Code], [ID Name]) < 6 then 'Other Shop' else Shop end as [Shop Code]
          from @ShopTable
        ) Q
        group by [ID Code], [ID Name], [Shop Code];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 2012-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-19
          • 2021-05-01
          相关资源
          最近更新 更多