Аналогично row-to-col (EAV для реляционного) - запрос SQL, пожалуйста - PullRequest
0 голосов
/ 15 декабря 2011

Мой набор данных не совсем похож на формат EAV, но он несколько похож;Вот данные:

original data

В следующем формате мне нужно:

data format needed

Для каждой группы EN_NO мне нужноданные в вышеуказанном формате.Если группа по EN_NO> 1, тогда ключ продукта дыхания должен идти в столбец продукта дыхания, в противном случае - нет (например, EN_NO 4 и 5).

Надеюсь, у меня все ясно.Данные находятся в таблице Qracle. Пожалуйста, предложите запрос, чтобы получить данные в нужном мне формате.

Спасибо, Пракаш

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

То, что вы показываете, это сводная таблица.Если вам нужен запрос, который будет автоматически добавлять столбцы, соответствующие различным значениям данных в вашей таблице, то вам не повезло.SQL не поддерживает это;столбцы должны быть известны и исправлены во время подготовки запроса - до того, как он прочитает какие-либо значения данных в таблице.

Для этого вам необходимо получить список различных значений prod_key (или подстроку вверхна :):

SELECT DISTINCT LEFT(PROD_KEY, 6) FROM yourTable;

А затем напишите код приложения, чтобы превратить этот список значений в серию выражений столбцов в динамическом операторе SQL, как упоминает @Dems.

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

0 голосов
/ 15 декабря 2011

Я очень рекомендую изменить структуру вашей таблицы.В настоящее время у вас есть две части информации, связанные в одном поле.Это анти-шаблон SQL, который уничтожает способность Oracle использовать определенные оптимизации.

Вместо этого рассмотрите возможность разделения "PROD_KEY" на два поля (PRODUCT_TYPE = Prod_A и т. Д.) (SUB_PRODUCT_ID = 1, 2, 3, так далее).Или, чтобы вызвать меньше потенциальных изменений в базе данных, просто добавьте PRODUCT_TYPE в вашу текущую таблицу.

Тем не менее, используя вашу текущую структуру ...

SELECT
  EN_NO,
  PROD_KEY,
  CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_A') THEN PROD_KEY ELSE NULL END AS Prod_A,
  CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_B') THEN PROD_KEY ELSE NULL END AS Prod_B,
  CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_C') THEN PROD_KEY ELSE NULL END AS Prod_C,
  PROD_QTY
FROM
  yourTable

Это работает, когда вы точно знаете, какие столбцы нужны для вывода.Если вам нужен код для адаптации к Prod_D и т. Д., То вам нужно написать код, который пишет код (динамический SQL).

...