2015-09-24 3 views
-3

У меня есть эта таблица:SQL запрос для объединения данных из одной и той же таблицы

create table mytable 
(ID varchar(10), VNDCOD INT, MANUF varchar(10), PRICE INT, COST INT); 

insert into mytable values 

('4', 1000, 'AG', 5455, 9384), 
('4', 1000, 'A1', 16, 31), 
('4', 2000, 'AG', 5253, 8339) 

Я хочу, чтобы иметь возможность выбрать что-то вроде этого:

ID MANUF PRICE COST PRICE COST 
4 AG  5455 9384 5253 8339 
4 A1  16  31 

Если есть два MANUF для ID , мы должны объединить их на одной линии, где слева находятся PRICE и COST, а слева - VNDCOD 2000 справа, как и в моем ожидаемом результате. Я не знаю, можно ли сделать это в одном запросе. Любая помощь будет принята с благодарностью.

+1

Вы должны были бы использовать [динамический pivot на нескольких столбцах] (http://blogs.lessthandot.com/index.php/datamgmt/datadesign/dynamic-pivot-on-multiple-columns/) для этого, вероятно, используя 'ROW_NUMBER()'. Лично я 'd рассмотрите эту проблему отображения, которая должна быть обработана в приложении. Выполнение такого рода сложностей с SQL, потому что оно ломается первым обычная форма. Язык не был написан с учетом такого рода вещей. Вы могли почти сказать, что это намеренно * сложно. –

+0

В чем проблема с решением ниже? В моей программе SQLRPGLE было проще и быстрее иметь только один курсор для заполнения моего подфайла. – Artyom2033

+0

Мое предположение заключалось в том, что 'VNDCOD' будет иметь множество различных возможных значений, не представленных двумя возможными значениями. Философски, однако, вы берете две колонки и разделяете их на четыре и создаете повторяющиеся группы. В таком тривиальном случае все будет хорошо работать, но оно не будет масштабироваться очень далеко. –

ответ

1

Либо использовать автообъединение или MAX (CASE) (fiddle):

select t1.ID, t1.MANUF, t1.PRICE, t1.COST, t2.PRICE, t2.COST 
from mytable as t1 left join mytable as t2 
    on t1.ID = t2.ID 
and t1.MANUF = t2.MANUF 
and t2.VNDCOD = 2000 
where t1.VNDCOD = 1000 
; 

select ID, MANUF, 
    max(case when VNDCOD = 1000 then PRICE end), 
    max(case when VNDCOD = 1000 then COST end), 
    max(case when VNDCOD = 2000 then PRICE end), 
    max(case when VNDCOD = 2000 then COST end) 
from mytable 
group by ID, MANUF 
0

Вы можете легко сделать это с помощью условной агрегации:

select id, 
     max(case when vndcode = 1000 then price end) as price_1000, 
     max(case when vndcode = 1000 then cost end) as cost_1000, 
     max(case when vndcode = 2000 then price end) as price_2000, 
     max(case when vndcode = 2000 then cost end) as cost_2000 
from mytable t 
group by id; 
Смежные вопросы