2013-12-11 2 views
0

Я думаю, что это не возможно, но мне нужен этот результат:Возможно ли для выходного sql-запроса?

Есть две таблицы:

work_item(work_item_id, name) со значениями ([529,DD],[539,ER])

work_item_party(work_item_id,party_type,party_name,country) со значениями ([1],[2],[3],[4],[5],[6],[7])

где

[1] = (529,applicant,mac,us) 
[2] = (529,consignee,l-communication,a) 
[3] = (529,end-user,u-a,a) 
[4] = (539,applicant,dell,us) 
[5] = (539,consignee,l-touch,b) 
[6] = (539,end-user,u-b,b) 
[7] = (539,end-user,c-b,b) 

Это выход мне нужно:

"work_item_id","name","applicant","consignee",end-user,"country" 
(
[529,DD,mac,l-communication,u-a,a], 
[539,ER,dell,l-touch,u-b,b], 
[539,ER,dell,l-touch,c-b,b] 
) 

Я могу вытащить данные для каждого случая, когда либо party_type является заявителем или грузополучателю или конечному пользователю, но трудно объединить их, чтобы получить результат как выход выше , Как вы думаете, это возможно. Если да, можете ли вы показать мне запрос?

Большое спасибо

Happy Christmas!

+0

Покажите свой запрос, что вы пробовали? – Fabio

ответ

0

SQL Fiddle

Oracle 11g R2 Настройка схемы:

CREATE TABLE work_item(work_item_id, name) AS 
      SELECT 529,'DD' FROM DUAL 
UNION ALL SELECT 539,'ER' FROM DUAL; 

CREATE TABLE work_item_party(work_item_id,party_type,party_name,country) AS 
      SELECT 529,'applicant','mac','us' FROM DUAL 
UNION ALL SELECT 529,'consignee','l-communication','a' FROM DUAL 
UNION ALL SELECT 529,'end-user','u-a','a' FROM DUAL 
UNION ALL SELECT 539,'applicant','dell','us' FROM DUAL 
UNION ALL SELECT 539,'consignee','l-touch','b' FROM DUAL 
UNION ALL SELECT 539,'end-user','u-b','b' FROM DUAL 
UNION ALL SELECT 539,'end-user','c-b','b' FROM DUAL; 

Запрос 1:

WITH applicant_consignees AS (
    SELECT p.work_item_id, 
     i.name, 
     MAX(CASE party_type WHEN 'applicant' THEN party_name END) AS applicant, 
     MAX(CASE party_type WHEN 'consignee' THEN party_name END) AS consignee 
    FROM work_item i 
     INNER JOIN 
     work_item_party p 
     ON (i.work_item_id = p.work_item_id) 
    WHERE party_type IN ('applicant', 'consignee') 
    GROUP BY p.work_item_id, i.name 
), 
end_users AS (
    SELECT work_item_id, 
     party_name AS "end-user", 
     country 
    FROM work_item_party 
    WHERE party_type = 'end-user' 
) 
SELECT a.*, 
     e."end-user", 
     e.country 
FROM applicant_consignees a 
     INNER JOIN 
     end_users e 
     ON (a.work_item_id = e.work_item_id) 
ORDER BY a.work_item_id, name, country 

Results:

| WORK_ITEM_ID | NAME | APPLICANT |  CONSIGNEE | END-USER | COUNTRY | 
|--------------|------|-----------|-----------------|----------|---------| 
|   529 | DD |  mac | l-communication |  u-a |  a | 
|   539 | ER |  dell |   l-touch |  u-b |  b | 
|   539 | ER |  dell |   l-touch |  c-b |  b | 
+0

Благодарим за быстрый ответ. Я получил это может дать решение: – user2066526

+0

выберите t1.work_item_party, t1.party_name в качестве заявителя, t2.party_name в качестве конечного пользователя, t3.party_name в качестве конечного пользователя, t1.country из wi_party t1 влево присоединиться к wi_party t2 на t1. work_item_party = t2.work_item_party осталось присоединиться wi_party t3 на t1.work_item_party = t3.work_item_party и t2.party_type = 'заявитель' где t1.party_type = 'грузополучателем' и t3.party_type = 'конечного пользователя' – user2066526

0

Как насчет этого.

Select A.work_item_id, A.name, B.party_name, C.party_name, D.party_name, D.Country 
From work_item as A 
    left outer join work_item_party as B on A.work_item_id = B.work_item_id and B.party_type = 'applicant' 
    left outer join work_item_party as C on A.work_item_id = C.work_item_id and C.party_type = 'consignee' 
    left outer join work_item_party as D on A.work_item_id = D.work_item_id and D.party_type = 'end-user' 

Я надеюсь, что вы ищете страну конечного пользователя ... Вы можете также использовать внутреннее соединение, если вы уверены, что там будет по крайней мере будет 1 запись на work_item_id на party_type в таблице Work_item_party

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