我遇到以下情况(表格架构:ID, first name, last name, value
)。:
table 1
:
ID | first name | last name | value
--------------------------------------
1 | John | Goodman | 5
2 | Peter | Snow | 6
3 | Mike | Walker | 7
4 | John | Goodman | 8
table 2
:
ID | first name | last name | value
--------------------------------------
1 | Peter | Snow | 2
2 | Bobby | White | 1
3 | Mike | Walker | 1
4 | Brad | West | 2
5 | Peter | Snow | 3
我想编写完整的外连接以获得第4列的总和,但每个名称只应放在结果(连接)表中一次,如下所示:
结果表:
ID | first name | last name | value.table1 | value.table2
-----------------------------------------------------------
1 | John | Goodman | 5 | 0
2 | Peter | Snow | 6 | 5
3 | Mike | Walker | 7 | 1
4 | Bobby | White | 0 | 1
5 | Brad | West | 0 | 2
我怎样才能做到这一点?
答案 0 :(得分:4)
这样的事情应该有效(如果我现在忽略ID
列):
SELECT
COALESCE(t1.FirstName,t2.FirstName) as FirstName,
COALESCE(t1.LastName,t2.LastName) as LastName,
COALESCE(t1.value,0) as t1value,
COALESCE(t2.value,0) as t2value
FROM
(select FirstName,LastName,SUM(value) as value
from table1
group by FirstName,LastName) t1
full outer join
(select FirstName,LastName,SUM(value) as value
from table2
group by FirstName,LastName) t2
on
t1.FirstName= t2.FirstName and
t1.LastName= t2.LastName
答案 1 :(得分:1)
With s as (Select firstname, lastname , value
From table1
Union all
Select firstname, lastname , value
From table2)
Select firstname, lastname , sum(value)
From s
Group by firstname , lastname
答案 2 :(得分:1)
试试这个:
SELECT COALESCE(T1.FName,T2.FName) as FName,COALESCE(T1.LName,T2.LName) as LName,ISNULL(T1.Value,0) as Value1,ISNULL(T2.Value,0) as Value2
FROM Table1 T1 FULL OUTER JOIN
Table2 T2 ON T1.FName=T2.FName AND T1.LName=T2.LName
<强>解释强>
COALESCE
返回列表中不是NULL
的第一个。
ISNULL
用于将NULL
值替换为0。
结果:
FNAME LNAME VALUE1 VALUE2
John Goodman 5 0
Peter Snow 6 2
Peter Snow 6 3
Mike Walker 7 1
John Goodman 8 0
Bobby White 0 1
Brad West 0 2
请参阅SQL Fiddle中的结果。
答案 3 :(得分:1)
这是mySQL的工作解决方案,忽略了ID列:
SELECT FirstName,
LastName,
SUM(tot1)
FROM (SELECT FirstName,
LastName,
sum(value) as tot1
FROM table1
GROUP BY FirstName,
LastName
UNION SELECT FirstName,
LastName,
sum(value)
FROM table2
GROUP BY FirstName,
LastName) t
GROUP BY FirstName,
LastName
答案 4 :(得分:0)
Declare @table1 Table (ID int, firstname varchar(30), lastname varchar(30), value int)
Declare @table2 Table (ID int, firstname varchar(30), lastname varchar(30), value int)
Insert into @table1 values
(1,'John', 'Goodman', 5 ),
(2,'Peter', 'Snow', 6 ),
(3,'Mike', 'Walker', 7 ),
(4,'John', 'Goodman', 8 )
Insert into @table2 values
(1, 'Peter', 'Snow', 2 ),
(2, 'Bobby', 'White', 1),
(3, 'Mike', 'Walker', 1),
(4, 'Brad', 'West', 2 ),
(5, 'Peter', 'Snow', 3 )
Select A.*,
ISNULL(B.value,0) [value.t1],
ISNULL(C.value,0) [value.t2]
From (
Select row_number() over (order by firstname) id,*
From (
Select firstname,lastname from @table1
union all
Select firstname,lastname from @table2
) Lu
group by firstname,lastname) A
Left Join (Select firstname,lastname,Min(value) value From @table1 Group By firstname,lastname) B On A.firstname = B.firstname And A.lastname = B.lastname
Left Join (Select firstname,lastname,Sum(value) value From @table2 Group By firstname,lastname) C On A.firstname = C.firstname And A.lastname = C.lastname
<强>结果强>