【问题标题】:How to group by with a special condition如何在特殊条件下分组
【发布时间】:2012-06-01 13:05:27
【问题描述】:

目前,当我发出此 SQL 时,它会获得不同的用户名。

我有一些不同的用户名,它们代表组,例如GRP_BSN.

我想将所有其他用户名(恰好是数字)分组到一个组中,例如GRP_OTHERS

select username, count(*)
from host
where seq between 0 and 2000
group by username;

63149   1
63732   1
64110   2
70987   12
76841   4
GRP_BSN 226
GRP_ASN 243
GRP_DSC 93

我可以实现这样的目标吗:

GRP_OTHERS 20
GRP_BSN 226
GRP_ASN 243
GRP_DSC 93

编辑:从答案修改查询

select username, count(*)
from host
  where created_dt 
  -- date selection
  between to_date('2012-may-23 00:00:00', 'yyyy-mon-dd hh24:mi:ss') 
  and to_date('2012-may-23 23:59:59', 'yyyy-mon-dd hh24:mi:ss')
GROUP BY CASE
             WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
                                                 ELSE username
         END;

【问题讨论】:

  • 我想知道我们是否有GROUP BY ( CONCATE( COL1 AND COL2 ) )

标签: sql oracle group-by


【解决方案1】:

如果您想通过将小组放入一个存储桶而不是特定的名称模式来做到这一点,您可以使用:

select (case when cnt > 100 then username else 'OTHER' end), sum(cnt) as cnt
from (select username, count(*) as cnt
      from host
      where seq between 0 and 2000
      group by username
     ) t
group by (case when cnt > 100 then username else 'OTHER' end)

【讨论】:

    【解决方案2】:

    @bfavaretto 很好(给他+1),但如果你不知道username 前缀或者它们不同,你可以使用类似的东西:

    GROUP BY CASE
                 WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
                                                     ELSE username
             END
    

    【讨论】:

    • 是的,这绝对比我的灵活!
    • @zerkms 我似乎遇到了 ORA-00920:无效的关系运算符 >
    • @Chin Boon:我的回答中的查询部分不会导致这种情况。您最好显示完整的查询(在您的问题中)
    • @zerkms 事实证明,我使用的是 9i Oracle。如果您在查询方面有类似的工作,请告诉我。
    【解决方案3】:

    效率不高,但应该可以:

    SELECT 
        CASE WHEN username LIKE 'GRP%' THEN username ELSE 'GRP_OTHERS' END AS username, 
        COUNT(*)
    FROM host
    WHERE seq BETWEEN 0 AND 2000
    GROUP BY CASE WHEN username LIKE 'GRP%' THEN username ELSE 'GRP_OTHERS' END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2018-08-21
      相关资源
      最近更新 更多