生成几行和某些值的分数并将所有结果相加

问题描述

我有一张桌子,如下表

    CustomerNumber  CustomerName    Type    Gender  Age Nationality Residance
    584             John Denver     Retail  Male    50  English     Domestic
    137             Jennifer Hazel  Retail  Female  34  Jamaican    Abroad
    547             Daniel Gorbo    Retail  Male    78  French      Domestic

我需要生成一个总成绩,具体取决于类型,性别,年龄,国籍和居留率。例如,

  • 对于性别,男性值生成“ 1”,女性值生成“ 0”
  • 对于年龄,如果年龄大于65,则生成“ 3”,否则生成“ 0”
  • 对于国籍,如果非英语,则产生2个其他0

最终表应如下所示:

    CustomerNumber  CustomerName    Type    Gender  Age Nationality Residance   RiskScore
    584             John Denver     Retail  Male    50  English     Domestic    1
    137             Jennifer Hazel  Retail  Female  34  Jamaican    Abroad      2
    547             Daniel Gorbo    Retail  Male    78  French      Domestic    6

我试图在主代码中添加sum和'case when',但是出现了'need group by function'的错误

sum( case when gender = 'Male' then 1 
        when age>65 then 3 
        when nationality = 'Abroad' then 2 else 0 end ) as RiskScore 

任何帮助将不胜感激。

解决方法

如果我正确理解了该问题,则无需汇总。使用加法和CASE表达式来计算风险评分:

SELECT 
   v.*,RiskScore = (
      CASE WHEN Gender = 'Male' THEN 1 ELSE 0 END +
      CASE WHEN Age > 65 THEN 3 ELSE 0 END +
      CASE WHEN Nationality <> 'English' THEN 2 ELSE 0 END
   )
FROM (VALUES
   (584,'John Denver','Retail','Male',50,'French','Domestic'),(137,'Jennifer Hazel','Female',34,'Jamaican','Abroad'),(547,'Daniel Gorbo',78,'English','Domestic')
) v (CustomerNumber,CustomerName,Type,Gender,Age,Nationality,Residance)

结果:

CustomerNumber CustomerName   Type   Gender Age Nationality Residance RiskScore
584            John Denver    Retail Male   50  French      Domestic  3
137            Jennifer Hazel Retail Female 34  Jamaican    Abroad    2
547            Daniel Gorbo   Retail Male   78  English     Domestic  4   
,
select *,(case when gender = 'Male' then 1 else 0 end  + 
case when    age>65 then 3 else 0 end + 
case when nationality <> 'English' 
then 2 else 0 end)  as risk_score from my_table;

只需相应地改变您的状况

,

根据您共享的逻辑,以下查询应使用CASE并给出不带分组依据的值,得出正确的结果:

Demo

SELECT A.*,COALESCE(case when gender = 'Male' then 1  ELSE 0 END,0) +
        COALESCE(CASE WHEN  age>65 then 3 ELSE 0 END,0) +
        COALESCE( CASE when Nationality  <> 'English' then 2 else 0 end,0 ) as RiskScore 
        FROM TABLE1 A;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...