SQL - разделить столбец с разделителями-запятыми на два столбца и выполнить расчет без использования функции

У меня есть строковый столбец в SQL Server, который содержит данные об оплате. Столбец содержит два данных, разделенных запятой, но иногда может содержать только одно. Мне нужно иметь возможность разделить этот единственный столбец на два новых столбца, преобразовать их в деньги и выполнить сумму двух.

Образец столбца оплаты

    +---------+
    | Payment |
    +---------+
    | 1000    |
    +---------+
    | 500, 100|
    +---------+
    | 10,20   |
    +---------+

желаемый результат

    +---------+---------+--------+-------+
    | Payment | split1  | split2 | total |
    +---------+---------+--------+-------+
    | 1000    | 1000    | 0      | 1000  |
    +---------+---------+--------+-------+
    | 500, 100| 500     | 100    | 600   |
    +---------+---------+--------+-------+
    | 10,20   | 10      | 20     | 30    |
    +---------+---------+--------+-------+

Я хотел бы запросить это в одном операторе выбора без использования функции.

Решение

Я сформулировал решение на основе ссылок, предоставленных комментаторами. Поскольку я не хотел использовать курсоры или функции, вот полный оператор выбора, который отвечает на мой вопрос:

    SELECT 
    cast(substring('1000,789',1,CHARINDEX(',', '1000,789')-1) as decimal(10,2)) AS Payment1,
    cast(substring('1000,789',CHARINDEX(',', '1000,789')+1,len('1000,789')) as decimal(10,2)) 
    as Payment2,
    cast(substring('1000,789',1,CHARINDEX(',', '1000,789')-1) as decimal(10,2)) + 
    cast(substring('1000,789',CHARINDEX(',', '1000,789')+1,len('1000,789')) as decimal(10,2))
     as TotalPayment from payment;

person Joey    schedule 31.08.2017    source источник
comment
Я хотел бы запросить это в одном выражении запроса без использования функций   -  person Joey    schedule 31.08.2017
comment
Используйте что-то вроде этого: выберите regexp_substr(val, '[^,]+', 1, 1) как val1,regexp_substr(val, '[^,]+', 1, 1) как val2   -  person Chetan_Vasudevan    schedule 31.08.2017
comment
Я бы хотел, чтобы этот вопрос был вновь открыт. Отмеченные ответы для обоих упомянутых потоков используют курсоры для разделения строки... Не совсем оптимальные решения... Возможно, этот поток может дать лучшие ответы.   -  person Jason A. Long    schedule 31.08.2017
comment
@JasonA.Long, ты прав. Я отредактировал этот пост и поделился своим решением. Я не уверен, что это оптимальное решение, но мне оно подходит, и я надеюсь, что оно поможет другим программистам.   -  person Joey    schedule 31.08.2017
comment
@Joe, главный вопрос в том, существует ли максимальное количество платежных значений, с которыми вам нужно иметь дело? Два это максимум? или могут быть десятки?   -  person Jason A. Long    schedule 31.08.2017
comment
@JasonA.Long только два. Система, принимающая платежи, фиксирует это в той же колонке. По сути, это разбивка платежа по двум конкретным товарам, купленным одновременно. Структура таблицы для этого приложения нуждается в серьезной переработке.   -  person Joey    schedule 31.08.2017
comment
-- извините за форматирование... ВЫБЕРИТЕ п.Платеж, св.Разделение1, св.Разделение2, Итого = св.Разделение1 + св.Разделение2 ИЗ #Платежа p ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ ( ЗНАЧЕНИЯ (CHARINDEX(',', п.Платеж, 1)) s (Разделить) ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ ( ЗНАЧЕНИЯ ( CAST(LEFT(p.Payment, ISNULL(NULLIF(s.Split, 0) - 1, 8000)) AS DECIMAL(9,2)), CAST(SUBSTRING( п.Платеж, с.Разделить + 1, 8000) AS DECIMAL(9,2)) ) ) sv (Разделить1, Разделить2);   -  person Jason A. Long    schedule 31.08.2017