2016-07-10 6 views
1

Hier ist meine aktuelle Tabelle:Wie kann ich eine Abkürzung von der Nummer machen?

// table 
+----+--------+------------+ 
| id | name | reputation | 
+----+--------+------------+ 
| 1 | jack | 534431  | 
| 2 | peter | 334  | 
| 3 | amos | 1300  | 
| 4 | carter | 13490  | 
| 5 | basil | 1351  | 
+----+--------+------------+ 

ich den Wert reputation Spalte mit einer Zahl auf Kilo Basis ändern möchten. Eigentlich versuche ich es kürzer zu machen. Genau das, was stackoverflow macht. Die erwartete Ausgabe ist also ungefähr so:

// newtable 
+----+--------+------------+ 
| id | name | reputation | 
+----+--------+------------+ 
| 1 | jack | 534k  | 
| 2 | peter | 334  | 
| 3 | amos | 1.3k  | 
| 4 | carter | 13.4k  | 
| 5 | basil | 1.3k  | 
+----+--------+------------+ 

Wie kann ich das tun?

+0

verwenden, um einen Fall/bei Block – Drew

+0

@Drew (http://stackoverflow.com/questions/38292759/how-can [Hah, zweimal!] -i-replace-null? noredirect = 1 # comment64002687_38292759) –

+2

Sie tun das nicht in Ihrem Tisch, das ist extrem ineffizient. Stattdessen speichern Sie den numerischen Wert und "übersetzen" ihn nur für die Visualisierung. Je nach Skriptsprache, die Sie für den Zugriff auf die Daten verwenden, sind Bibliotheken vorhanden. – arkascha

Antwort

1

können Sie concat() verwenden, case, und einige Arithmetik:

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 
. . . 

EDIT:

Um das Komma für einige Werte zu erhalten:

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 
. . . 

Here eine SQL Fiddle ist.

+0

Funktioniert nicht http://sqlfiddle.com/#!9/67634b/13 –

+0

Auch Ihre Lösung unterstützt keine Float-Ergebnisse wie diese '1.3k' –

+0

@MartinAJ. . . Die Antwort wurde behoben. Ich denke, 'format()' ist die beste Funktion zu verwenden. –

2

kann ich CASE WHEN und TRAILING wie folgt verwenden:

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` 
+0

yeehaw eine selbst Antwort, +1 – Drew

Verwandte Themen