2016-01-21 3 views
0

Я пытаюсь объединить ячейки вместе каждой комбинацией, упорядоченной по алфавиту. то есть линию для каждой возможной пары, набор из 3, набор из 4 и т. д.SQL Комбинации нескольких строк по одному и тому же идентификатору

Информация, которая может помочь; Каждый идентификатор будет иметь от 2 до 6 частей, и будет указывать, сколько частей у него есть.

i.e. Мои данные в настоящее время выглядят так;

ID | Number_of_parts | Part_no. | Description | Price 

    1   3    1   Apple  0.50 
    1   3    2   Cucumber  0.25 
    1   3    3   Banana  0.30 
    2   2    1   Donut  1.00 
    2   2    2   Banana  0.40 

, и я хотел бы получить следующий результат;

ID | Desc1 | Price1 | Desc2 | Price2 | Desc3 | Price3 | Desc4 | Price4 

    1  Apple 0.50 Banana 0.30 Cucumber 0.25 NULL NULL 
    1  Apple 0.50 Banana 0.30 NULL  NULL NULL NULL 
    1  Apple 0.50 Cucumber 0.25 NULL  NULL NULL NULL 
    1  Banana 0.30 Cucumber 0.25 NULL  NULL NULL NULL 
    2  Banana 0.40 Donut  1.00 NULL  NULL NULL NULL 

Любая помощь приветствуется,

Спасибо.

+0

Что у вас есть? Нам нужна начальная точка для работы, чтобы посмотреть, как вы сейчас пытаетесь это сделать ... – user2366842

+0

Вот отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

можете ли вы получить пару из 5 или 10 или около того? В этом случае, как вы хотите обрабатывать вывод с 4 уровнями? – Utsav

ответ

1

Если вы ограничены четырьмя возможностями, то вы можете использовать left join. Почти следующие работы:

select d1.id, 
     d1.desc as desc1, d1.price as price1, 
     d2.desc as desc2, d2.price as price2, 
     d3.desc as desc3, d3.price as price3, 
     d4.desc as desc4, d4.price as price4 
from data d1 left join 
    data d2 
    on d1.id = d2.id and d1.partno < d2.partno left join 
    data d3 
    on d1.id = d3.id and d2.partno < d3.partno left join 
    data d4 
    on d1.id = d4.id and d3.partno < d4.partno; 

Проблема в том, что она не даст яблоко/банан. Итак, вы, кажется, хотите пары как минимум. Тогда я думаю, что самый простой способ получить пары - использовать UNION:

select d1.id, 
     d1.desc as desc1, d1.price as price1, 
     d2.desc as desc2, d2.price as price2, 
     d3.desc as desc3, d3.price as price3, 
     d4.desc as desc4, d4.price as price4 
from data d1 join 
    data d2 
    on d1.id = d2.id and d1.partno < d2.partno left join 
    data d3 
    on d1.id = d3.id and d2.partno < d3.partno left join 
    data d4 
    on d1.id = d4.id and d3.partno < d4.partno; 
union 
select d1.id, 
     d1.desc as desc1, d1.price as price1, 
     d2.desc as desc2, d2.price as price2, 
     NULL, NULL, NULL, NULL 
     d3.desc as desc3, d3.price as price3, 
     d4.desc as desc4, d4.price as price4 
from data d1 join 
    data d2 
    on d1.id = d2.id and d1.partno < d2.partno; 
+0

Как этот UNION может быть действительным, если вы добавили 4 дополнительных столбца NULL в нижнюю половину? –

+0

Нет, к сожалению, существует не более 4 возможностей (их, несомненно, много). Даже если бы я мог получить пары, 3s и 4s, которые были бы очень полезны – Bob

+0

@Bob. , , SQL-запрос имеет фиксированное количество столбцов. Вам понадобится другое представление, если у вас есть неограниченное количество комбо в группе. –

Смежные вопросы