Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我怎样才能从号码中缩写出来?_Mysql_Sql - Fatal编程技术网

Mysql 我怎样才能从号码中缩写出来?

Mysql 我怎样才能从号码中缩写出来?,mysql,sql,Mysql,Sql,这是我当前的表格: // table +----+--------+------------+ | id | name | reputation | +----+--------+------------+ | 1 | jack | 534431 | | 2 | peter | 334 | | 3 | amos | 1300 | | 4 | carter | 13490 | | 5 | basil | 1351 |

这是我当前的表格:

// table
+----+--------+------------+
| id |  name  | reputation |
+----+--------+------------+
| 1  | jack   | 534431     |
| 2  | peter  | 334        |
| 3  | amos   | 1300       |
| 4  | carter | 13490      |
| 5  | basil  | 1351       |
+----+--------+------------+
我想将
信誉
列的值更改为基于公斤的数字。事实上,我想把它缩短一些。stackoverflow就是这么做的。因此,预期输出如下所示:

// newtable
+----+--------+------------+
| id |  name  | reputation |
+----+--------+------------+
| 1  | jack   | 534k       |
| 2  | peter  | 334        |
| 3  | amos   | 1.3k       |
| 4  | carter | 13.4k      |
| 5  | basil  | 1.3k       |
+----+--------+------------+
SELECT id, name,
    CASE WHEN value >= 1000 THEN
         CONCAT(TRIM(TRAILING '.' FROM SUBSTR(TRUNCATE(number/1000, 1), 1, 4)), 'k')
         ELSE value
    END as reputation
FROM `table`
我该怎么做呢?

您可以使用
concat()
case
,以及一些算法:

select id, name,
       (case when reputation < 1000 then cast(reputation as char)
             when reputation < 1000000 then concat(cast(floor(reputation/1000) as char), 'k')
             when reputation < 1000000000 then concat(cast(floor(reputation/1000000) as char), 'M')
             else 'Wow!!!'
        end) as reputation
. . .
选择id、名称、,
(声誉<1000时的情况,然后施放(声誉为字符)
当声誉<1000000时,则concat(铸造(地板(声誉/1000)为字符),'k')
当声誉<100000000时,则concat(铸造(地板(声誉/1000000)为字符),'M')
还有“哇!!!”
(完)作为名誉
. . .
编辑:

要获取某些值的小数点,请执行以下操作:

select id, name,
       (case when reputation < 1000 then format(reputation, 0)
             when reputation < 100000 then concat(format(reputation/1000, 2), 'k')
             when reputation < 1000000 then concat(format(reputation/1000, 0), 'k')
             when reputation < 100000000 then concat(format(reputation/1000000, 1), 'M')
             when reputation < 1000000000 then concat(format(reputation/1000000, 0), 'M')
             else 'Wow!!!'
        end) as reputation
. . .
选择id、名称、,
(声誉<1000时的情况,然后格式(声誉,0)
当声誉<100000时,则为concat(格式(声誉/1000,2),“k”)
当声誉<1000000时,则使用concat(格式(声誉/1000,0),“k”)
当声誉<100000000时,则使用concat(格式(声誉/1000000,1),“M”)
当声誉<100000000时,则为concat(格式(声誉/1000000,0),“M”)
还有“哇!!!”
(完)作为名誉
. . .

是一个SQL提琴。

我可以在以下情况下使用
大小写:

// newtable
+----+--------+------------+
| id |  name  | reputation |
+----+--------+------------+
| 1  | jack   | 534k       |
| 2  | peter  | 334        |
| 3  | amos   | 1.3k       |
| 4  | carter | 13.4k      |
| 5  | basil  | 1.3k       |
+----+--------+------------+
SELECT id, name,
    CASE WHEN value >= 1000 THEN
         CONCAT(TRIM(TRAILING '.' FROM SUBSTR(TRUNCATE(number/1000, 1), 1, 4)), 'k')
         ELSE value
    END as reputation
FROM `table`

使用case/whenblock@Drew你不能在你的桌子里这样做,这是极不有效的。相反,您存储数值,并且仅动态地“转换”它以进行可视化。根据访问数据时使用的脚本语言,有相应的库。@arkascha我不想将它们存储为kilo,我想在选择行时将其转换。您必须使用case构造。不管您使用的是脚本语言还是sql。但是,您可以将该逻辑放入sql中的存储过程中,并在
SELECT
query期间将其用作函数。是的,您有一个自我回答,+1而且您的解决方案不支持这样的浮点结果
1.3k
@MartinAJ。答案已经确定。我认为
format()
是最好的函数。