查询特定表中的数据分类

时间:2018-12-16 21:04:51

标签: sql sql-server

我有一个像这样的表

| client_id | product_type |
|-----------|--------------|
| c_1       | toy          |
| c_2       | toy          |
| c_3       | furniture    |
| c_3       | furniture    |
| c_3       | book         |
| c_4       | toy          |
| c_4       | furniture    |
| c_5       | book         |
| c_5       | book         |
| c_5       | book         |

如您所见,每个客户可以分配多个产品。

我必须按客户拥有的产品对其进行分类。

  • 如果为客户分配了产品toy,则他们应该拥有toys 在结果表中,无论他们是否还有其他产品。
  • 如果为客户分配了产品furniture,则无论是否有其他产品,他们都应在结果表中添加furnitures
  • 如果为客户分配了产品book,则无论结果是否有其他产品,他们都应在结果表中添加books……

每个客户端只能在结果中出现一次。

对于上面的示例,结果将是:

| client_id | cat        |
|-----------|------------|
| c_1       | toys       |
| c_2       | toys       |
| c_3       | furnitures |
| c_4       | toys       |
| c_5       | books      |

2 个答案:

答案 0 :(得分:1)

您可以使用CASE分配优先级,例如

select client_id, 
  'cat_' + 
     min(case product_type 
        when 'toy' then '1'
        when 'furniture' then '2'
        when 'book' then '3'
      end)
from tab
group by client_id

如果您有一个表来定义每个产品的类别/优先级,那会更容易,那么这是一个简单的联接,而不是CASE。

答案 1 :(得分:0)

我认为获得所需结果的逻辑是:

select client_id, 
       (case when sum(case when product_type = 'toy' then 1 else 0 end) > 0
             then 'toys'
             when sum(case when product_type = 'furniture' then 1 else 0 end) > 0
             then 'furnitures'
             when sum(case when product_type = 'book' then 1 else 0 end) > 0
             then 'books'
        end) as category 
from t
group by client_id;