做题时碰到如下题目:
查询出报销费用在前三位的报销类型和报销总费用,并通过排序函数显示名次。(如果消费金额相同显示相同的名次)
出错点在于CASE语句,代码如下:
使用的mysql版本:8.0.22
SELECT typeName,suap,
CASE
WHEN @priRank=suap THEN @nowRank
WHEN @priRank:=suap THEN @nowRank:=@nowRank+1
END RANK
FROM (SELECT typeName,SUM(applyAmount) AS suap
FROM expenseType
LEFT JOIN expenseDetail ON expenseDetail.typeId = expenseType.exId
GROUP BY typeId
ORDER BY suap DESC) AS a,(SELECT @nowRank:=0,@priRank:=NULL) AS b;
报错信息:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RANK FROM (SELECT typeName,SUM(applyAmount) AS suap FROM expenseType LEFT JOIN ' at line 5
目的:
1.当priRank检测出值等于时,输出nowRank
2.第二条WHEN语句给priRank赋值然后输出nowRank+1同时更新nowRank的值
诉求:希望能了解到如何解决该问题以及CASE语句的正确用法
【已解决】
错误原因:8.0.18版本后不能使用RANK作为别名
更改别名后可正常运行
case语句不能用变量,只能用字段名称
WHEN suap=1 THEN ‘1对应的值’
case
when 列名= 条件值1 then 选项1
when 列名=条件值2 then 选项2.......
else 默认值 end