如何将两个不同的表连接到第三个表中

时间:2015-01-10 16:39:58

标签: sql sql-server-2008-r2

我有两个包含数据的表InboundCallsOutboundCalls,如下所示:

InboundCalls I
Date        System    VDN      VDNName    GroupID    GroupName   AllCalls    RecordedCalls
01/08/2015  1         2750001  Sales      1          AllUsers    50          49
01/08/2015  1         2750001  CustServ   1          AllUsers    25          25
01/08/2015  1         2750001  CustServ   2          Supervisors 10          9
01/08/2015  2         2851234  Payments   1          AllUsers    30          29

OutboundCalls O
Date        System    GroupID    GroupName    AllCalls    RecordedCalls
01/08/2015  1         1          AllUsers     65          65
01/08/2015  1         2          Supervisors  20          19
01/08/2015  2         1          AllUsers     30          30

我想要完成的是创建第三个表格,将每个JoinedCalls加在一起,AllCalls以及每个RecordedCalls的总计DateSystemGroupIDGroupID。其中一个挑战是System特定于GroupID = 1,因此有多个GroupID = 2InboundCalls I等等。此外,OutboundCalls O还有VDN没有,VDNNameUNION ALL的其他列。可以有多个GroupID接收来自VDN 275001的呼叫,以及来自多个VDN的呼叫,这些VDN由同一GroupID处理。我需要总计2015年8月1日,系统1和GroupID 1的所有呼叫。然后总计2015年8月1日,系统1,组ID 2的所有呼叫。然后日期01/08/2015,系统2,GroupID 1.等等。

我知道我需要从查询中省略VDN和VDNName,因为它并不存在于两个表中。我已经尝试了两个选择和GROUP BY,但看起来我为Date,VDN和GroupID的每个组合获取了行,即使我没有选择VDN。我还使用了JoinedCalls J Date System GroupID GroupName AllCalls RecordedCalls 01/08/2015 1 1 AllUsers 140 139 01/08/2015 1 2 Supervisors 30 28 01/08/2015 2 1 AllUsers 60 59 Date,System,GroupID,所以我认为它会将它们结合起来。编辑:我也尝试使用SUM(I.AllCalls + O.AllCalls),SUM(I.RecordedCalls + O.RecordedCalls),但这导致了两者的疯狂高数。

上述样本数据的所需输出:

{{1}}

我在SQL中自学成才,这意味着我的知识肯定存在巨大差距。如果需要更多信息,请告诉我,并提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

试试这个:

create table InboundCalls (
    [Date] date,       
    [System] int,    
    VDN int,     
    VDNName varchar(50),   
    GroupID int,    
    GroupName varchar(50),  
    AllCalls int,    
    RecordedCalls int
);

create table OutboundCalls (
    [Date] date,       
    [System] int,      
    GroupID int,    
    GroupName varchar(50),  
    AllCalls int,    
    RecordedCalls int
);

insert into InboundCalls (
[Date], [System], VDN, VDNName, GroupID, GroupName, AllCalls, RecordedCalls) 
values
('01/08/2015', 1, 2750001, 'Sales', 1, 'AllUsers', 50, 49),
('01/08/2015', 1, 2750001, 'CustServ', 1, 'AllUsers', 25, 25),
('01/08/2015', 1, 2750001, 'CustServ', 2, 'Supervisors', 10, 9),
('01/08/2015', 2, 2851234, 'Payments', 1, 'AllUsers', 30, 29);

insert into OutboundCalls (
[Date], [System],  GroupID, GroupName, AllCalls, RecordedCalls) values
('01/08/2015',  1, 1, 'AllUsers', 65, 65),
('01/08/2015',  1, 2, 'Supervisors', 20, 19),
('01/08/2015',  2, 1, 'AllUsers', 30, 30);

select [date]
, [system]
, groupid
, groupname
, sum (allcalls) [allcalls]
, sum(recordedcalls) [recordedcalls]
from (
    select [date], [system], groupid, groupname, allcalls, recordedcalls
    from inboundcalls
    union all
    select [date], [system], groupid, groupname, allcalls, recordedcalls
    from outboundcalls
) as t
group by [date], [system], groupid, groupname;

结果

date        system  groupid groupname   allcalls    recordedcalls
-----------------------------------------------------------------
2015-01-08  1       1       AllUsers    140         139
2015-01-08  1       2       Supervisors 30          28
2015-01-08  2       1       AllUsers    60          59