请问这个sql语句为什么不对?count不是这样用的吗? 80
题主你好,
从语句上看count语句使用的没毛病, 但从报错上看应该是题主在建表的时候sale_price用的是字符型而非相应的数字类型. 因为在执行语句的时候要进行数字的比较, 即数值类型与数值类型的比较. 所以当sale_price的类型为varchar类型时, 你认为的是1000<=1000,但实际上是"1000"<1000, 举个不恰当的例子就好像拿175的身高和180的体重去比是一样的,是不能相比的.
所以题主首先要将sale_price字段的类型转换为数字类型,如整型int.
-----
当题主把sale_price类型转换为数字类型后会发现,语句执行没问题了, 但结果和预期的不一样,解决办法是将三个case when后面的else 0都去掉.解释下原因:
先看下官网对于count()函数作用的描述:
count(X)函数的作用是计算X为非NULL值时的条数,而题主现在这么写,条件成立则显示的是product_name,不成立显示的是0,而NULL即不等于0也不等于product_name,所以最终三个count的结果都是8(每个case when都会对整个表进行遍历,然后得到一个临时表,count()再数一下这个临时表中非NULL的条数):
+-----------+
| low_price |
+-----------+
| T恤衫 |
| 打孔机 |
| 0 |
| 0 |
| 0 |
| 叉子 |
| 擦菜板 |
| 圆珠笔 |
+-----------+
而将case when的else 0部分去掉后,满足条件的部分显示为product_name,不显示的就默认为NULL了,再根据count()函数的特性,就可以得到正确的结果了:
+-----------+
| low_price |
+-----------+
| T恤衫 |
| 打孔机 |
| NULL |
| NULL |
| NULL |
| 叉子 |
| 擦菜板 |
| 圆珠笔 |
+-----------+
-----
正确的语句见下图:
-----
该题可以使用sumif进行处理, 具体代码见截图:
=====
希望可以帮到题主, 欢迎追问.