Скажите, что у меня есть следующая таблица (id_a, id_b, type на самом деле целые числа, данные на самом деле xml):
id_a id_b type data
-----+------+--------+--------
1 1 X X1
1 1 Y Y1
7 17 Y Y2
7 99 X X2
9 20 Z Z1
Сочетание id_a, id_b и type уникально.Теперь программа, которую я пишу, получает в качестве входных данных список типов, которые мне нужны.Предположим, что этот список содержит X и Y. Теперь я хочу сделать несколько SQL-Magic, которые в итоге приведут к следующему результату:
id_a id_b X Y
-----+------+--------+--------
1 1 X1 Y1
7 17 NULL Y2
7 99 X2 NULL
Другими словами: я хочу строку, которая содержит все данные для id_a и id_b, перечисляя данные в столбцах.
Мне удалось самостоятельно найти запрос, который заканчивается следующей таблицей:
table:
id_a id_b data_x data_y
-----+------+--------+--------
1 1 X1 NULL
1 1 NULL Y1
7 17 NULL Y2
7 99 X2 NULL
Запрос:
select
id_a,
id_b,
case when type = 'X' then data
end data_x,
case when type = 'Y' then data
end data_y,
from
mytable
order by
id_a,id_b
В этой таблице гарантируется, что
- Максимум один из data_x или data_y может быть не NULL (оба NULL тоже в порядке, но это, конечно, может быть легко отфильтровано с помощью
where data_x is not null or data_y is not null
) - data_x и data_y уникальны для комбинации id_a и id_b.
И если бы я мог теперь сделать select coalesce(case ... data_y),coalesce(case ... data_y) from ... group by id_a,id_b
, то я бы сказал, что я был бы там, где я хочуда, но, к сожалению, coalesce - это не агрегатная функция, а скалярная функция.
В моем клиентском приложении (написанном на Java) я, конечно, могу перебирать строки, объединяя строки, но это выглядит не очень элегантно;-).Есть ли "симпатичный" способ решить эту проблему?
Я использую DB2 V9.7, но я бы предпочел портативное решение ...