Скажем, у меня есть запрос, который возвращает такие значения:

id    type     value
aaa   1a        10
aaa   1b        20
aaa   1c        7
bbb   2a        10
bbb   1a        5

Имеется> 50 миллионов строк и 240 возможных «типов». Я хочу сделать сводную таблицу, в которой есть одна строка для каждого id, и каждый type является собственным столбцом:

id   1a   1b   1c   2a
aaa  10   20   7    
bbb  5              10

Я могу сделать это на SQL-сервере, но не знаю, как это сделать в Teradata. У меня слишком много столбцов, чтобы делать заявления CASE. Однако каждый отдельный type находится в поле таблицы, если это поможет.

3
Jeffrey Kramer 12 Мар 2014 в 00:24

3 ответа

Лучший ответ

В Teradata SQL нет сводной функции. Здесь был дан ответ на аналогичный вопрос - teradata sql переносит несколько вхождений в дополнительные столбцы < / а>.

Чтобы наилучшим образом достичь желаемого, не выписывая 250 случаев вручную, вам следует использовать упорядоченные аналитические функции в виде цикла или набора. Попробуйте выполнить поиск по тегу loop в Teradata Developer Exchange - http://developer.teradata.com/tag/loop

Вот как я бы это сделал: используйте другой язык программирования (Python), чтобы повторить текст / предварительно созданный SQL и изменить его только две переменные 250 раз, от 1 до 250, и сгенерировать полный длинный sql. Повторяйте только часть между SELECT DISTINCT id и последней FROM mytable строкой:

SELECT DISTINCT
id
-- reiteration starts here
,(SELECT SUM(value) -- assuming you have unique types for every id
  FROM (SELECT DISTINCT
    id
    ,value
    ,type
    FROM mytable
    QUALIFY (RANK() OVER(PARTITION BY type ORDER BY id ASC))=1 -- variable 1
    )
) AS type_1 -- variable 2
-- reiteration ends here
FROM mytable

Вы можете использовать этот питон:

for i in range(1,251):
    print " \
,(SELECT SUM(value) -- assuming you have unique types for every id \
FROM (SELECT DISTINCT \
id \
,value \
,type \
FROM mytable \
QUALIFY (RANK() OVER(PARTITION BY type ORDER BY id ASC))=%d -- variable 1 \
) \
) AS type_%d -- variable 2 \
" % (i,i)
5
Community 23 Май 2017 в 15:08

Функцию TD_UNPIVOT, добавленную в TD 14.10, можно найти в TD_SYSFNLIB.

Функция TD_UNPIVOT

SQL-команды PIVOT и UNPIVOT были добавлены в Teradata 16, и их можно найти в руководстве по функциям, операторам, выражениям и предикатам SQL. В настоящее время я не могу найти их в онлайн-руководстве, поэтому вам нужно будет загрузить PDF-файл с Teradata.com.

Новые функции TD 16 PIVOT и UNPIVOT

1
Todd Wilson 19 Авг 2017 в 01:30
1
Обе функции можно найти в Интернете в разделе Функции и операторы , глава Агрегатные функции : info.teradata.com/HTMLPubs/DB_TTU_16_00/SQL_Reference/…
 – 
dnoeth
19 Авг 2017 в 01:36

Используя функцию PIVOT в Teradata 16, это может выглядеть так (при условии, что ваши типы находятся в таблице с именем mytypetable):

SELECT 
  *
FROM 
  mytable PIVOT (SUM("value") FOR "type" IN (SELECT "Type" FROM mytypetable)) AS Temp_pivot
ORDER BY 
  id

Одним из недостатков является то, что вы не можете выбрать порядок столбцов.

0
Bomada 28 Окт 2019 в 14:20