在连接上查询2个视图 - 一半的答案被重复

时间:2016-11-20 21:01:13

标签: sql join

我有2个视图,一个持有入站呼叫和其他出站呼叫。我希望我的查询加入2个视图,以便每个运算符(destinationname和origininationname)并排显示入站和出站。目前,我的当前查询重复了连接的一半,在入站下面的示例中。

SELECT i.destinationname, i.volumein as inbound, o.volumeout as outbound,
       i.year, i.month
FROM InboundCalls i
     inner join OutboundCalls o
          on i.destinationname = o.originationname
GROUP BY i.year, i.month, i.destinationname, o.volumeout, i.volumein


DestinationName  Inbound   Outbound  Year  Month
Accounts Spare      9         33    2016    8
Accounts Spare      9          9    2016    8
Accounts Spare      9          7    2016    8
Accounts Spare      9         38    2016    8
Accounts Spare     21         33    2016    9
Accounts Spare     21          9    2016    9
Accounts Spare     21          7    2016    9
Accounts Spare     21         38    2016    9

我正在寻找的结果将类似于以下内容;

DestinationName  Inbound   Outbound  Year  Month
Accounts Spare      84       210    2016    9
Accounts Spare      12        32    2016    11
Accounts Spare      36       103    2016    10
Steve Jones         36        96    2016    8
Wayne Rooney       162       172    2016    8
Alan Shearer         1       216    2016    9
Alan Shearer        74        82    2016    8

如果需要澄清,请告诉我。

2 个答案:

答案 0 :(得分:0)

错误结果的原因是您只加入目的地名称,而不是年月和月份。

首先,您不仅需要加入DestinationName,还需加入YearMonth。如果视图每个不同的目标名称,年份和月份都有一行,那么您也可以删除GROUP BY

其次,你可能需要一个FULL JOIN而不是INNER JOIN,假设你想要的结果只有Incoming而不是Outgoing数据(反之亦然)一个月。

SELECT 
    COALESCE(i.destinationname, o.destinationname) AS DestinationName 
    COALESCE(i.volumein, 0)    AS InBound, 
    COALESCE(o.volumeout, 0)   AS OutBound,
    COALESCE(i.year, o.year)   AS Year, 
    COALESCE(i.month, o.month) AS Month
FROM InboundCalls AS i
     FULL JOIN OutboundCalls AS o
     ON  i.destinationname = o.originationname
     AND i.year = o.year
     AND i.month = o.month ;

答案 1 :(得分:-1)

如果我理解正确,你会希望输出为:

DestinationName  Inbound   Outbound  Year  Month
Accounts Spare      9         87    2016    8

在这种情况下,我认为您获得重复的原因是因为您正在通过o.volumeout和i.volumein进行分组。

如果您想要每个月和每年使用一行,那么您可以按目的地名称,mont和year进行分组,然后使用SUM来获取总数。

SELECT i.destinationname, sum(i.volumein) as inbound, sum(o.volumeout) as outbound,
       i.year, i.month
FROM InboundCalls i
     inner join OutboundCalls o
          on i.destinationname = o.originationname
GROUP BY i.year, i.month, i.destinationname