问题描述
我有一张桌子,如下表
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并给出不带分组依据的值,得出正确的结果:
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;