2017-02-02 9 views
1

Ich habe eine Abfrage, die eine ganze Zahl aus einer mathematischen Berechnung zurückgibt. Ich muss alle Ziffern in dieser Ganzzahl summieren.Summe der Ziffern einer Zahl in Mysql

Etwas wie folgt aus:

select sumdigits(number) from dual 
-- if number =123, output: 1+2+3 = 6 
-- if number =100, output: 1+0+0 = 1 
+0

Nein, gibt es nicht. –

+0

überprüfen Sie diese Frage: http://stackoverflow.com/questions/3671921/mysql-query-for-sum-and-distinct?rq=1 – JavaQueen

+0

Ist die Breite der Zahl festgelegt, z. immer 3 Ziffern? Ich denke im allgemeinen Fall würde man eine UDF dafür haben wollen. –

Antwort

3

Ich wollte dies mit Fiddle oder Rextester testen, aber weder jetzt funktioniert. Also, Ihr upvotes/downvotes wird als Test dienen:

SELECT CAST(SUBSTRING(number, 1, 1) AS UNSIGNED) +    -- first digit 
     CAST(SUBSTRING(number, 2, 1) AS UNSIGNED) +    -- second digit 
     CAST(SUBSTRING(number, 3, 1) AS UNSIGNED) AS the_sum  -- third digit 
FROM yourTable 

Dies setzt voraus, eine Zahl mit einer maximalen Breite von 3 Ziffern, die auch mit Nullen aufgefüllt ist (wie Sie erwähnen, dass wir annehmen können).

Wenn Sie wirklich diese in der Produktion müssen tun, sollten Sie vielleicht eine benutzerdefinierte Funktion erstellen solche Manipulationen zu handhaben, Grenzfälle usw.

Update:

mit dem Kommentar Going durch @ ThorstenKettner könnten wir diese Antwort auf ein number Feld von jeder Länge verallgemeinern, indem wir einfach mehr Terme für jede Ziffernposition hinzufügen. Zum Beispiel, wenn wir wollten Zahlen decken, die bis zu vier Ziffern breit sein können wir einfach diesen Begriff hinzu:

+ CAST(SUBSTRING(number, 4, 1) AS UNSIGNED) 

, die entweder würde eine Reihe falls vorhanden hinzufügen oder würde Null, wenn nicht hinzufügen.

+0

Danke Mann! Sie haben eine positive Einstellung, nicht negativ. – Lamar

+0

@Lamar Gut, wenn Sie meine andere Hälfte sehen wollen LOL :-P –

+0

Ernsthaft, ich bin müde von smarta $$ Leute, die nur negatives Feedback geben, anstatt Lösungen anzubieten. – Lamar

3

Ich schäme mich sogar vorschlagen, dies aber ...

SELECT 
    foo, 
    CHAR_LENGTH(
     REPLACE(
      REPLACE(
       REPLACE(
        REPLACE(
         REPLACE(
          REPLACE(
           REPLACE(
            REPLACE(
             REPLACE(
              REPLACE(
               REPLACE(foo, '-', ''), 
              '0', ''), 
             '1', '1'), 
            '2', '22'), 
           '3', '333'), 
          '4', '4444'), 
         '5', '55555'), 
        '6', '666666'), 
       '7', '7777777'), 
      '8', '88888888'), 
     '9', '999999999') 
    ) AS digit_sum 
FROM (
    SELECT 123 AS foo 
    UNION ALL SELECT 100 
    UNION ALL SELECT 413432143 
    UNION ALL SELECT -6301 
    UNION ALL SELECT 1234567890 
) x 
+------------+-----------+ 
| foo  | digit_sum | 
+------------+-----------+ 
|  123 |   6 | 
|  100 |   1 | 
| 413432143 |  25 | 
|  -6301 |  10 | 
| 1234567890 |  45 | 
+------------+-----------+ 
5 rows in set (0.00 sec) 

Es wahrscheinlich mehr Sinn macht als Funktion neu geschrieben, zusammen mit einigen Fehlerprüfung NULL auf Schwimmern zurückzukehren, oder sowas ähnliches.

+0

Nun, auch wenn dies schmerzhaft ist (wie ich mir vorstellen kann), ist dies eine "gute" Idee. – AxelH

+0

Die Erweiterung auf hexadezimale Ziffern bleibt dem Leser als Übung überlassen ;-) –

Verwandte Themen