2016-11-07 2 views
2

Во-первых, мне нужно поблагодарить Кент Миллиган и его статью в http://www.mcpressonline.com/sql/techtip-combining-multiple-row-values-into-a-single-row-with-sql-in-db2-for-i.html за то, что у меня есть такая проблема, как у меня. Но теперь мне нужно расширить то, что он сделал здесь.Совпадение нескольких значений строк в 1 строку, с SQL для iSeries

Чтобы избежать необходимости переходить к его статье, проблема, с которой он обращался, заключалась в объединении строковых данных из нескольких строк в одну строку в результирующей таблице. Например:

Таблица Автомобили:

  • Марка Модель
  • Ford Fusion
  • Chevy Tahoe
  • Honda Odyssey
  • Ford Taurus
  • Ford Focus
  • Chevy Malibu

Результаты:

  • Марка Модель
  • Chevy Malibu, Tahoe
  • Ford Focus, Taurus, Fusion
  • Honda Odyssey

Это было сделано с утверждением SQL:

WITH numbered_sets(make, model, curr, prev) AS (
    SELECT make, model, 
     ROW_NUMBER() OVER (PARTITION BY make ORDER BY model) AS curr, 
     ROW_NUMBER() OVER (PARTITION BY make ORDER BY model) -1 AS prev 
    FROM inventory) 
SELECT make, 
     MAX (TRIM(L ',' FROM 
      CAST(SYS_CONNECT_BY_PATH(model, ',') AS VARCHAR(256)))) 
FROM numbered_sets 
START WITH curr = 1 
CONNECT BY make = PRIOR make AND prev = PRIOR curr 
GROUP BY make 

Я смог приспособить это к своему столу и получить большую часть того, что хотел. Но для моих целей у меня есть дополнительная колонка, которую мне нужно включить для группировки.Например:

Таблица Автомобили:

  • Марка Тип Модель
  • Форд седан Fusion
  • Chevy SUV Tahoe
  • Honda минивэн Odyssey
  • Форд седан Taurus
  • Форд Седан Фокус
  • Chevy Sedan Malibu
  • Форд внедорожник избежать
  • Форд внедорожник Проводник
  • Chevy Impala Sedan

за результаты, я бы искал:

  • Марка Тип Модель
  • Chevy Malibu седан , Импала
  • Chevy SUV Tahoe
  • Форд седан Fusion, Taurus, Focus
  • Форд внедорожник Escape, Explorer,
  • Honda минивэн Odyssey

Кто-нибудь есть какие-либо мысли о том, что все, что мне нужно добавить в первоначальное заявление, чтобы иметь возможность добавить TYPE и GROUP соответственно? Я пробовал несколько вещей, но я подозреваю, что мне нужно что-то сделать с утверждением CONNECT_BY_PATH, я просто не уверен, что.

Спасибо

ответ

1

Я думаю, вам просто нужно интегрировать тип в правильных точках thoughtout запроса.

не имея возможности проверить, я думаю, что это будет близко; но я, возможно, что-то пропустил ...

WITH numbered_sets(make, type, model, curr, prev) AS (
    SELECT make, type, model, 
     ROW_NUMBER() OVER (PARTITION BY make, Type ORDER BY Make, Type, model) AS curr, 
     ROW_NUMBER() OVER (PARTITION BY make, type ORDER BY Make, type, model) -1 AS prev 
    FROM inventory) 
SELECT make, Type 
     MAX (TRIM(L ',' FROM 
      CAST(SYS_CONNECT_BY_PATH(model, ',') AS VARCHAR(256)))) 
FROM numbered_sets 
START WITH curr = 1 
CONNECT BY make = PRIOR make AND prev = PRIOR curr and type = prior type 
GROUP BY make, type 

Возможно, нам нужно сделать изменить подключения с делать CONCAT перед соединением с помощью ... хотя я не могу понять, почему это помогло бы еще ...

CONNECT BY concat(make,type) = PRIOR concat(make,type) AND prev = PRIOR curr 
+0

Благодарим за предложение. Я думал, что что-то подобное может сработать, но это не так. То, что я закончил, было: Chevy SUV Tahoe; Чеви Седан Тахо, Малибу, Импала; Внедорожник Ford, Explorer; Ford Sedan Escape, Explorer, Fusion, Телец, Фокус. Похоже, что он разбивается на Type, но когда он делает соединение, он добавляет все результаты. – Andrew

+0

Это странно, потому что в соединении я добавил тип = предыдущий тип. так что он будет пересекать соединение только по типу и типу. поэтому должны быть подключены только модели для одного и того же типа/типа. – xQbert

+0

Ahh, ну, я пропустил ваше дополнение к линии CONNECT BY, поэтому у меня была проблема, которую я видел (извините за это). Я добавил, что все еще есть проблема. Теперь я получаю только 1 строку для каждого Make. Chevy SUV Tahoe; Внедорожник Ford, Explorer. – Andrew