将具有相似字符串的行分组

时间:2015-07-18 03:45:43

标签: sql postgresql aggregate

我搜索了很多,但大多数解决方案都是针对连接选项而不是我真正想要的。

我有一个名为X的表(在Postgres数据库中):

anm_id  anm_category anm_sales
1       a_dog        100
2       b_dog        50
3       c_dog        60
4       a_cat        70
5       b_cat        80
6       c_cat        40

我希望通过分组' a_dog',' b_dog',' c_dog'来获得总销售额。作为狗和' a_cat',' b_cat',' c_cat'像猫一样。

我无法更改表格中的数据,因为它是一个外部数据库,我只能从中获取信息。

如何使用SQL查询执行此操作?它不需要特定于Postgres。

4 个答案:

答案 0 :(得分:2)

使用case语句将相同类别的动物分组在一起

SELECT CASE 
         WHEN anm_category LIKE '%dog' THEN 'Dogs' 
         WHEN anm_category LIKE '%cat' THEN 'cats' 
         ELSE 'Others' 
       END            AS Animals_category, 
       Sum(anm_sales) AS total_sales 
FROM   yourtables 
GROUP  BY CASE 
            WHEN anm_category LIKE '%dog' THEN 'Dogs' 
            WHEN anm_category LIKE '%cat' THEN 'cats' 
            ELSE 'Others' 
          END 

此查询也适用于大多数数据库。

答案 1 :(得分:1)

使用 PostgreSQL split_part()

select animal||'s' animal_cat,count(*) total_sales,sum(anm_sales) sales_sum from(
select split_part(anm_cat,'_',2) animal,anm_sales from x 
)t
group by animal

sqlfiddle

MySQL

中创建split_str()
select animal||'s' animal_cat,count(*) total_sales,sum(anm_sales) sales_sum from(
select split_str(anm_cat,'_',2) animal,anm_sales from x 
)t
group by animal

sqlfiddle

答案 2 :(得分:0)

您可以Document.insertString(...) Document分组:

substr

答案 3 :(得分:0)

如果你有一个恒定长度的附录,如例:

SELECT CASE right(anm_category, 3) AS animal_type  -- 3 last char
     , sum(anm_sales) AS total_sales 
FROM   x 
GROUP  BY 1;
  • 您根本不需要CASE声明,但如果使用的话,请将其设为“简单”CASE

  • 使用位置参考而不是重复可能冗长的表达式。

如果长度不同,但示例中总是有一个下划线:

SELECT split_part(anm_category, '_', 2) AS animal_type  -- word after "_"
     , sum(anm_sales) AS total_sales 
FROM   x 
GROUP  BY 1;