2013-07-09 175 views
1

我的问题是,我甚至不知道这种查询是否可能。我会尝试解释:mySQL复杂多项查询

我有两个关于电话呼叫,“呼叫”和“失败呼叫”的表格。

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

我想,每一个可能的目的地和路线夫妇,呼叫次数和失败呼叫数,如下面的代码:

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 

“正确”的列是确定的,但在“失败”栏显示所有失败呼叫的总和目的地返回,在每一行(我在查询中检查了更多目的地)。

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

+0

请参阅CASE,如在SELECT CASE WHEN ... THEN ... END – Strawberry

回答

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; 
+0

此代码似乎有效。明天我会彻底测试它。谢谢!! – user2564388

+0

它确实有用!非常感谢你! – user2564388

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 
+0

f.id_failed_call永远不是NULL,它是表键。 – user2564388

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; 
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) 

dr子查询获取目的地和路线的所有可能的组合 - 使用UNION DISTINCT的指示复印件的,应当删除。

然后c子查询加入每个目标和路由的“正确”计数,如果存在这样一个计数的话。

然后f子查询加入每个目标和路由的“失败”计数,如果存在这样一个计数的话。

Sqlfiddle here

分享和享受。