2016-01-22 39 views
1

我正在嘗試編寫一個select語句,爲每個名稱收集一行。預計產量因此:加入給出錯誤的總數

名稱=鋁,工資= 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

一個提示,做'SELECT * FROM TABLE_1 t1 LEFT JOIN table_2 t2 ON t1.Name = t2.Name'。 – jarlh

回答

5

集團的表分別由員工,然後加入他們的行列:

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 
;