SQL / Knime - Транспонировать таблицу с «Группой по» - PullRequest
3 голосов
/ 03 ноября 2010

Название ужасное, но это лучшее, что я мог сделать.У меня есть что-то вроде этого:

Country  Tag    Weight
-----------------------
1        1      20
1        2      30
1        3      77
2        1      10
2        2      11
2        3      100

Или в удобочитаемой форме:

Country  Tag    Weight
-----------------------
USA      Rock   20
USA      Pop    30
USA      Metal  77
Spain    Rock   10
Spain    Pop    11
Spain    Metal  100

Использование SQL (для создания представления) или инструментов манипулирования данными в Knime,Мне нужно манипулировать данными в этой форме:

Country  Rock   Pop   Metal
----------------------------
USA      20     30    77
Spain    10     11    100

По сути, записи тегов (уникальные) становятся столбцами, а страны (уникальные) становятся идентификаторами строк со значениями веса, привязанными к их стране / тегу..

Я перепробовал все, что мог придумать в Knime, и не приходит в голову необработанный запрос SQL.В Knime я успешно создал структуру матрицы, которую я хочу (Country x Tag), но я не знаю, как заполнить фактические значения Weight, все они - вопросительные знаки.Мое рабочее решение - просто вывести данные в файл CSV в нужной форме, а не в базу данных.Но это глупо и раздражает, чтобы синхронизироваться.Есть идеи?

Ответы [ 3 ]

3 голосов
/ 03 ноября 2010

Вы ищете pivot или cross table.Я не сильно увлекаюсь Knime, но это техника, которую вы хотите найти в Google.если у Knime нет этой функции, вы можете сделать хуже, чем поместить эти CSV-данные в MS Excel и развернуть их.

2 голосов
/ 04 ноября 2010

Вы можете использовать узел Pivoting в KNIME, чтобы выполнить трюк. Просто выберите столбец «Тег» как столбец «Сводная таблица», столбец «Страна» как столбец «Группа», а в разделе «Агрегирование» столбец «Вес» и сумму метода агрегирования. До свидания, Tobias

2 голосов
/ 03 ноября 2010

Используя ANSI SQL, вы должны использовать:

  SELECT t.country,
         MAX(CASE WHEN t.tag = 'Rock' THEN t.weight END) AS Rock,
         MAX(CASE WHEN t.tag = 'Pop' THEN t.weight END) AS Pop,
         MAX(CASE WHEN t.tag = 'Metal' THEN t.weight END) AS Metal
    FROM YOUR_TABLE t
GROUP BY t.country

LesterDove верен - вам нужен сводный запрос для преобразования данных строки в столбчатые данные.

PIVOT (иUNPIVOT) - это синтаксис ANSI, но поддержка немного запаздывает - SQL Server 2005+, Oracle 11g + - единственные, о которых я знаю.Это следующий наиболее ANSI / широко поддерживаемый подход.

...