2017-02-02 4 views
1

У меня есть запрос, который возвращает целочисленное число из математического расчета. Мне нужно суммировать все цифры этого целого числа.Суммировать цифры числа в mysql

Что-то вроде этого:

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

Нет, нет. –

+0

проверить этот вопрос: http://stackoverflow.com/questions/3671921/mysql-query-for-sum-and-distinct?rq=1 – JavaQueen

+0

Является ли ширина числа фиксированным, например. всегда 3 цифры? Я думаю, что в общем случае вам нужен UDF для этого. –

ответ

3

Я хотел проверить это с помощью скрипку или Rextester, но ни один не работает прямо сейчас. Таким образом, ваши upvotes/downvotes будут служить в качестве теста:

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 

Это предполагает ряд с максимальной шириной 3 цифр, который также нули (как вы упомянули, мы можем предположить).

Если вам действительно нужно сделать это в производстве, вероятно, вы должны создать определенную пользователем функцию для обработки таких манипуляций, крайние случаи, и т.д.

Update:

Going с комментарием по @ ThorstenKettner мы могли бы обобщить этот ответ на поле numberлюбой длины, просто добавив больше терминов для каждой позиции цифр. Например, если мы хотим, чтобы покрыть номера, которые могут быть шириной до четырех цифр мы могли бы просто добавить этот термин:

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

который либо добавить номер, если присутствует, или бы добавить ноль, если нет.

+0

Спасибо человеку! У вас позитивное отношение, а не отрицательное. – Lamar

+0

@ Lamar Хорошо вниз меня, если вы хотите увидеть мою вторую половину LOL :-P –

+0

Серьезно, я устал от smarta $$ людей, которые дают отрицательную обратную связь вместо предоставления решений. – Lamar

3

Мне стыдно даже предположить, что это, но ...

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) 

Это, вероятно, имеет смысл переписать в виде функции, вместе с проверкой некоторые ошибки, чтобы вернуть NULL на поплавках или что-то похожее.

+0

Ну, даже если это больно предлагать (как я могу себе представить), это «хорошая» идея. – AxelH

+0

Расширение его до шестнадцатеричных цифр остается как упражнение для читателя ;-) –

Смежные вопросы