繁体   English   中英

SQL - 如何对案例语句进行分类?

[英]SQL - How to Categorize a Case Statement?

在这个示例数据集中,我有一些颜色:“红色”和“蓝色”以及一些水果:“苹果”和“葡萄”与人/姓名相关联。

在此处输入图像描述

我的目标是为这些分组中的每一个添加一个列,称为"Colors"Fruit 每当它们各自分组的值 > 0 时,这些新添加的列将计数 +1。

例如,如果 "Red" 或 "Blue" 包含 > 0 的值,我们将 +1 添加到Colors 对于 John Smith,由于 Red 和 Blue 列都包含 > 0 的值,因此Colors列将为 2。这是预期的输出:

在此处输入图像描述

我知道 case 语句可以加 1 或 0,但是当每个分组有 2 列时,我们该怎么做呢?

你不需要在 CASE 中。

SELECT blue, red, (blue > 0) + (red > 0) colors,
       apple, grapes, (apple > 0) + (grapes > 0) fruit
FROM source_table

源表中的值不应为 NULL。

SELECT
  *,
  ((CASE WHEN apple > 0 THEN 1 ELSE 0 END) + (CASE WHEN WHEN grapes > 0 THEN 1 ELSE 0 END)) as fruit,
  ((CASE WHEN red > 0 THEN 1 ELSE 0 END) + (CASE WHEN blue > 0 THEN 1ELSE 0 END)) as colors
from table

假设源数据处于旋转状态

with cte as (
select 'john' as name, 2 as blue, 3 as red, 2 as apple, 4 as grape union all
select 'tom', 0 , 8, 0, 0
)
select
      name
    , blue
    , red
    , coalesce((blue > 0),0) 
      + coalesce((red > 0),0)
      as colours
    , apple
    , grape
    , coalesce((apple > 0),0) 
      + coalesce((grape > 0),0)
      as fruits
from cte
姓名 | 蓝色 | 红色 | 颜色 | 苹果| 高分辨率照片| CLIPARTO 葡萄| 高分辨率照片| CLIPARTO 水果
 :--- |  ---: |  --: |  ------: |  ----: |  ----: |  -----:
约翰 |  2 |  3 |  2 |  2 |  4 |  2
汤姆|  0 |  8 |  1 |  0 |  0 |  0

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM