2013-09-28 7 views
0

Постановка задачиTeradata: Сумма до значения в столбце

Пример показан на рисунке ниже:

Последние 2 строки имеют узоры, как «1.283 2 3» в одной ячейке. Цифры разделяются пробелом в столбце. Нам нужно добавить эти nos и представить в формате, указанном в Output.

Таким образом, элемент, имеющий "1,283 2 3" должны быть преобразованы в 6.283

проблемы, стоящие перед:

  1. В столбце значения находятся в формате строки.
  2. Добавьте nos после их литья в целое число
  3. Не хотите брать данные в окне UNIX и управлять ими.

enter image description here

+0

Какой у вас релиз Teradata? Каково максимальное количество значений? Конечно, это абсолютно плохая модель данных, нарушающая 1-ю нормальную форму. Вместо этого следует исправить это. – dnoeth

+0

Выпуск 13.10 ... на самом деле данные, которые я получаю в col2, являются некоторыми вычислениями .. Мне просто нужно подвести итог этим nos. – Debaditya

+0

«некоторый расчет» вы можете показать, какой расчет? Почему вы не делаете сумму во время этого расчета? – dnoeth

ответ

2

В TD14 было бы встроенный в таблице UDF имени STRTOK_SPLIT_TO_TABLE, прежде чем вам нужно реализовать свой собственный UDF или использовать рекурсивный запрос.

Я изменил существующую строку расщепляющий сценарий использовать пробелы в качестве разделителя:

CREATE VOLATILE TABLE Strings 
(
    groupcol INT NOT NULL, 
    string VARCHAR(991) NOT NULL 
) ON COMMIT PRESERVE ROWS; 

INSERT INTO Strings VALUES (1,'71.792'); 
INSERT INTO Strings VALUES (2,'71.792 1 2'); 
INSERT INTO Strings VALUES (3,'1.283  2 3'); 

WITH RECURSIVE cte 
(groupcol, 
    --string, 
    len, 
    remaining, 
    word, 
    pos 
) AS (
    SELECT 
    GroupCol, 
    --String, 
    POSITION(' ' IN String || ' ') - 1 AS len, 
    TRIM(LEADING FROM SUBSTRING(String || ' ' FROM len + 2)) AS remaining, 
    TRIM(SUBSTRING(String FROM 1 FOR len)) AS word, 
    1 
    FROM strings 
    UNION ALL 
    SELECT 
    GroupCol, 
    --String, 
    POSITION(' ' IN remaining)- 1 AS len_new, 
    TRIM(LEADING FROM SUBSTRING(remaining FROM len_new + 2)), 
    TRIM(SUBSTRING(remaining FROM 1 FOR len_new)), 
    pos + 1 
    FROM cte 
    WHERE remaining <> '' 
) 
SELECT 
    groupcol, 
    -- remove the NULLIF to get 0 for blank strings 
    SUM(CAST(NULLIF(word, '') AS DECIMAL(18,3))) 
FROM cte 
GROUP BY 1 

Это может использовать много золотника, надеюсь, вы не работаете, что на большом столе.

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