2016-11-21 9 views
-1

Таблица Aсумма столбца на основе отдельного значения другого столбца в Oracle

A1 A2 
1 7 
2 8 
1 9 

Таблица B

A1 B2 
1 2 
2 3 

я хочу что-то вроде этого

select A.A1,sum(case when distinct A.A1 then B2),sum(A.A2) from 
A,B 
where A.A1=B.A1(+) 
group by A.A1 

После Присоединение к моему столу будет

A1 A2 B2 
1 7 2 
2 8 3 
1 9 2 

результирующая таблица

A1 A2 B2 
1 7+9 2(only once) 
2 8  3 

как получить сумму B2, когда отчетливый A1 после соединения таблиц, как указано выше. Заранее заблаговременно

+2

Каков ваш ожидаемый результат? – Wanderer

+0

is table_b.a1 уникально? – Boneist

+0

Вы используете устаревший синтаксис соединения. Вы вынуждены работать над очень старой версией Oracle, или это просто, что вам была дана очень старая книга? Вместо этого используйте правильные явные ANSI-соединения, если это возможно ('из левого внешнего соединения b на a.a1 = b.a1'). –

ответ

0

Использовать JOIN и GROUP BY.

Запрос

SELECT t1.A1, SUM(t1.A2) AS A1, SUM(t2.B2) AS B2 
FROM TableA t1 
JOIN TableB t2 
ON t1.A1 = t2.A1 
GROUP BY t1.A1; 
+0

Я хочу то же самое с левым внешним соединением. вы можете предоставить решение без суб-запроса. Любая возможность с условной суммой? –

+0

@SiddeshwarGajula: условная сумма в смысле? – Wanderer

+0

выберите A.A1, ** sum (случай, когда различны A.A1, затем B2) **, сумма (A.A2) от A, B где A.A1 = B.A1 (+) группа по A.A1 , хотя синтаксис неверен только для объяснения. –

0

С table_b.a1 является уникальной, лучшим способом сделать это было бы отработать сумму table_a.a2 первыми, чтобы уменьшить количество строк, вы присоединяетесь к , а затем присоединитесь к таблице_b. Тогда вам не нужно беспокоиться о суммировании различных значений table_b.b2, которые вам в противном случае пришлось бы делать.

WITH table_a AS (SELECT 1 a1, 7 a2 FROM dual UNION ALL 
       SELECT 2 a1, 8 a2 FROM dual UNION ALL 
       SELECT 1 a1, 9 a2 FROM dual), 
    table_b AS (SELECT 1 a1, 2 b2 FROM dual UNION ALL 
       SELECT 2 a1, 3 b2 FROM dual) 
-- end of mimicking your two tables with sample_data in them; 
-- see the sql below: 
SELECT ta.a1, 
     ta.a2, 
     tb.b2 
FROM (SELECT a1, SUM(a2) a2 
     FROM  table_a 
     GROUP BY a1) ta 
     INNER JOIN table_b tb ON ta.a1 = tb.a1; 

     A1   A2   B2 
---------- ---------- ---------- 
     1   16   2 
     2   8   3 

Если вы абсолютно необходимо соединить две таблицы первого (я не рекомендую, это делает больше работы для базы данных, чтобы сделать), то вы могли бы сделать что-то вроде:

WITH table_a AS (SELECT 1 a1, 7 a2 FROM dual UNION ALL 
       SELECT 2 a1, 8 a2 FROM dual UNION ALL 
       SELECT 1 a1, 9 a2 FROM dual), 
    table_b AS (SELECT 1 a1, 2 b2 FROM dual UNION ALL 
       SELECT 2 a1, 3 b2 FROM dual) 
SELECT ta.a1, 
     SUM(ta.a2) a2, 
     MAX(tb.b2) b2 
FROM  table_a ta 
     INNER JOIN table_b tb ON ta.a1 = tb.a1 
GROUP BY ta.a1; 

     A1   A2   B2 
---------- ---------- ---------- 
     1   16   2 
     2   8   3 

Поскольку для table_a.a2 может быть только одно значение для таблицы table_a.a1, мы можем просто выбрать одно из значений для использования через MAX (мы могли бы использовать MIN или SUM(distinct tb.b2) вместо, fyi).

+0

Спасибо за решение. –

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