2016-01-22 5 views
1

Я пытаюсь написать оператор выбора, собирающий одну строку для каждого имени. Ожидаемый выход отсюда:Соединиться дает неправильную сумму

Name = Al, зарплата = 30, бонус = 10

Table_1

Name Salary 
Al  10 
Al  20 

Table_2

Name Bonus 
Al 5 
Al 5 

Как я пишу это? я стараюсь:

Select t1.Name, SUM(t1.Salary), SUM(t2.Bonus) FROM table_1 t1 
LEFT JOIN table_2 t2 
ON t1.Name=t2.Name 
Group By 1 

Я получаю бонус 20 вместо 10 в качестве бонуса. Вероятно, это потому, что в t1 есть две строки, из которых суммируется бонус. Как я могу изменить свою функцию, чтобы получить правильный бонус?

+0

намек, сделать 'выбрать * из table_1 t1 LEFT JOIN table_2 t2 ON t1.Name = t2.Name'. – jarlh

ответ

5

Group таблицы отдельно работником, а затем присоединиться к ним:

SELECT t1.Name, Salary, Bonus 
FROM (
    SELECT Name, SUM(Salary) Salary 
    FROM table_1 
    GROUP BY Name 
) t1 
LEFT JOIN (
    SELECT Name, SUM(Bonus) Bonus 
    FROM table_2 
    GROUP BY Name 
) t2 ON t1.Name = t2.Name 
+0

Вам нужно квалифицировать имя в списке выбора. – jarlh

+0

Спасибо. Починил это. – Codo

1

Вы можете сделать это с помощью подзапроса, как это:

declare @salary table (Name varchar(100), value int) 
declare @bonus table (Name varchar(100), value int) 

insert into @salary 
values ('al', 10) 

insert into @salary 
values ('al', 20) 

insert into @bonus 
values ('al', 5) 

insert into @bonus 
values ('al', 5) 


select s.Name, sum(value) as Salary, Bonus 
from @salary s JOIN 
(
    select Name, sum(value) as Bonus 
    from @bonus 
    group by Name 
) b on b.name = s.Name 
group by s.Name, b.Bonus 
1
SELECT 
    coalesce(t1.name,t2.name) name, 
    coalesce(sum(t1.salary),0) salary_total, 
    coalesce(sum(t2.bonus),0) bonus_total 
FROM 
    (select name, sum(salary) salary from salary_table group by 1) t1 
FULL OUTER JOIN 
    (select name, sum(bonus) bonus from bonus_table group by 1) t2 
ON (t1.name=t2.name) 
GROUP BY 1 
; 
Смежные вопросы