1

我的问题是我什至不知道这种查询是否可行。我将尝试解释:

我有两张关于电话的表格,“Calls”和“Failed_Calls”。

两个表中的重要列是“Destination”和“Route”,但还有更多列,例如 Id_call 和 start_date 和 called_number 等等。我将省略有关时间段的过滤器以简化。“呼叫”中的目的地可能不存在于“失败呼叫”中,反之亦然。

对于每个可能的 Destination 和 Route 对,我想获得调用计数和失败调用计数,如下面的代码:

select c.Destination, c.Route, count(c.id_call) as Correct, null as Failed 
from Calls c
where c.Destination like ('Algeria%')
group by c.Destination, c.Route
union all
select f.Destination, f.Route, null, count(f.id_failed_call) as Failed
from Failed_Calls f
where f.Destination like ('Algeria%')
group by f.Destination, f.Route

表明:

Destination    Route   Correct   Failed
Algeria        9       1         NULL
Algeria Mobile 9       4         NULL
Algeria Mobile 9       NULL      2

...这是正确的,但我需要在单行上显示最后两行的数据,即该目的地和路线的正确和失败呼叫的计数。

我尝试过加入、左加入和不加入,但我总是得到一个错误的计数,比如每对夫妇的通话和通话失败的结果。到目前为止,我最好的镜头是:

select c.Destination, c.Route, count(distinct(c.id_call)) as Correct,
 count(distinct(f.id_failed_call)) as Failed
from Calls c, Failed_Calls f
where c.Destination like 'Algeria%'
 and f.Destination like 'Algeria%'
group by c.Destination, c.Route

...返回以下内容:

Destination     Route     Correct    Failed
Algeria         9         1          2
Algeria Mobile  9         4          2

“正确”列没问题,但“失败”列显示每行返回的所有目的地的失败调用总和(我已经在查询中检查了更多目的地)。

如果这种查询是可能的,我希望有人可以帮助我。

4

4 回答 4

0

尝试类似的东西:

select c.Destination, c.Route, SUM(c.id_call) as Correct,
SUM(case when f.id_failed_call is NULL then 0 else 1 end)) as Failed
from Calls c, Failed_Calls f
where c.Destination like 'Algeria%'
and f.Destination like 'Algeria%'
group by c.Destination, c.Route
于 2013-07-09T16:14:36.160 回答
0

您应该能够基本上将您的工作查询包装到外部选择中,并将行分组在那里;

SELECT Destination, Route,
       COALESCE(SUM(Correct), 0) Correct, COALESCE(SUM(Failed), 0) Failed
FROM (
  SELECT c.Destination, c.Route, COUNT(c.id_call) as Correct, NULL AS Failed 
  FROM Calls c
  WHERE c.Destination like ('Algeria%')
  GROUP BY c.Destination, c.Route
  UNION ALL
  SELECT f.Destination, f.Route, NULL, COUNT(f.id_failed_call) AS Failed
  FROM Failed_Calls f
  WHERE f.Destination LIKE ('Algeria%')
  GROUP BY f.Destination, f.Route
)
GROUP BY Destination, Route;
于 2013-07-09T16:17:42.370 回答
0

尝试

SELECT dr.DESTINATION,
       dr.ROUTE,
       IFNULL(c.CORRECT_COUNT, 0) AS CORRECT_COUNT,
       IFNULL(f.FAILED_COUNT, 0) AS FAILED_COUNT
  FROM (SELECT DISTINCT DESTINATION, ROUTE
          FROM CALLS
        UNION DISTINCT
        SELECT DISTINCT DESTINATION, ROUTE
          FROM FAILED_CALLS) dr
  LEFT OUTER JOIN (SELECT DESTINATION,
                          ROUTE,
                          COUNT(DISTINCT ID_CALL) AS CORRECT_COUNT
                     FROM CALLS
                     GROUP BY DESTINATION, ROUTE) c
    ON (c.DESTINATION = dr.DESTINATION AND
        c.ROUTE = dr.ROUTE)
  LEFT OUTER JOIN (SELECT DESTINATION,
                          ROUTE,
                          COUNT(DISTINCT ID_CALL) AS FAILED_COUNT
                     FROM FAILED_CALLS
                     GROUP BY DESTINATION, ROUTE) f
    ON (f.DESTINATION = dr.DESTINATION AND
        f.ROUTE = dr.ROUTE)

子查询获取 DESTINATION 和 ROUTE的dr所有可能组合 - 使用 UNION DISTINCT 表示应删除重复项。

然后c,如果存在这样的计数,则子查询会加入每个目的地和路线的“正确”计数。

然后f,如果存在这样的计数,则子查询会加入每个目的地和路线的“失败”计数。

Sqlfiddle在这里

分享和享受。

于 2013-07-09T16:29:38.820 回答
0

在这种情况下我没有尝试过,但我之前使用过这样的查询来汇总来自 UNION 的数据。

select Destination, route, sum(Correct), sum(Failed ) from (
    select c.Destination, c.Route, count(c.id_call) as Correct, 0 as Failed 
    from Calls c
    where c.Destination like ('Algeria%')
    group by c.Destination, c.Route
    union all
    select f.Destination, f.Route, 0 as Correct, count(f.id_failed_call) as Failed
    from Failed_Calls f
    where f.Destination like ('Algeria%')
    group by f.Destination, f.Route) as temp_table
group by Destination, route;
于 2013-07-09T16:14:28.567 回答