2013-08-08 3 views
0

У меня есть 3 таблицы.Oracle: Курсор Процедура: сумма 2 таблицы с соединением

Table1

|Obj_id|Obj_Name| 
---------------- 
|A  |  AAA| 
|B  |  BBB| 
|C  |  CCC| 

Table2

|Obj_id|Amount1| 
---------------- 
|A  | 1000| 
|C  |  20| 
|A  | 100| 
|B  |  50| 
|C  |  10| 

Таблица3

|Obj_id|Amount2| 
---------------- 
|B  | 500| 
|C  |  10| 
|C  |  40| 

Теперь мне нужно создать процедуру "отчет", который возвращает курсор, как показано ниже

Report

|Obj_Name|Amount1|Amount2|Obj_id| 
--------------------------------- 
|AAA  | 1100|  0|A  | 
|BBB  |  50| 500|B  | 
|CCC  |  30|  50|C  | 

Я googled везде, но нет соответствующего ответа.

+0

Где делает 'sum' вписываться в него - у вас есть несколько значений для каждого' 'obj_id' в table2/3'? У вас есть основной запрос, и нужно просто выяснить, как вернуть его из процедуры? (Если вы действительно * возвращаете *, то это функция, не уверен, что вы имеете в виду это или процедуру с параметром 'out'). –

+0

Это моя ошибка с примером суммы. Я поставил вопрос в соответствие с моим делом. Функция или процедура в порядке, если она решает проблему. – user2663001

ответ

1

Попробуйте

SELECT 
    T1.Obj_Name 
    ,NVL(T2.Amount1,0) AS Amount1 
    ,NVL(T3.Amount2,0) AS Amount2 
    ,NVL(T1.Obj_id ,0) AS Obj_id 
FROM Table1 T1 
LEFT JOIN Table2 T2 ON T1.Obj_id = T2.Obj_id 
LEFT JOIN Table3 T3 ON T1.Obj_id = T3.Obj_id 
ORDER BY T1.Obj_Name 

SQL FIDDLE DEMO

ВЫВОД

Obj_Name Amount1 Amount2 Obj_id 
AAA  1000  0  A 
BBB  0  500  B 
CCC  20  10  C 

EDIT

SELECT 
    T1.Obj_Name AS Obj_Name 
    ,NVL(T2.Amount1,0) AS Amount1 
    ,NVL(T3.Amount2,0) AS Amount2 
    ,T1.Obj_id AS Obj_id 
FROM Table1 T1 
LEFT JOIN (SELECT Obj_id,SUM(Amount1) AS Amount1 FROM Table2 GROUP BY Obj_id) T2 ON T1.Obj_id = T2.Obj_id 
LEFT JOIN (SELECT Obj_id,SUM(Amount2) AS Amount2 FROM Table3 GROUP BY Obj_id) T3 ON T1.Obj_id = T3.Obj_id 
ORDER BY T1.Obj_Name; 

SQL FIDDLE DEMO UPDATED

ВЫВОД

OBJ_NAME AMOUNT1 AMOUNT2 OBJ_ID 
AAA  1100  0  A 
BBB  50   500 B 
CCC  30   50  C 
+0

Спасибо за ваш ответ, но я поставил вопрос, чтобы соответствовать моему делу. Надеюсь, что вы должны дать мне другое решение. – user2663001

+0

@ user2663001 Проверьте обновленное решение – bvr

+0

Да, это то, что мне нужно. Теперь я просто добавлю «Открыть курсор для выбора ...», чтобы завершить процедуру. Ты как бог. Большое спасибо. – user2663001

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