2017-07-31 97 views
1

我对MySQL过去的标准查询的经验非常有限,但是涉及多个表之间的连接和关系时,我有点问题。加入并选择多个表格并创建新列名称

我的任务是创建一个作业,每隔15分钟从mysql数据库中提取一些值,但它需要显示的信息是从多个表中提取的。

我已经使用了它一段时间来找出电话系统的一切之间的关系,我发现我需要把所有东西都拉出来,但我试图找到正确的方式来创建工作来做连接。

我想为我的信息需要,与列命名为创建一个新表:

Extension | Total Talk Time | Total Calls | Outbound Calls | Inbound Calls | Missed Calls 

我知道我需要开始从我的“用户”表和匹配扩展ID它在'callSession'中带有'extensionID'。每个extensionID可能有多个实例,但每个实例都会创建一个新的'UniqueCallID'。

'UniqueCallID'字段然后匹配我'CallSum'表中的'UniqueCallID'。在那一点上,我只需要能够说“对于与同一个”extensionID“关联的每个'uniqueCallID',获取每列中所有实例的总和或这些实例的计数”。

这里是什么,我需要做的一个例子:

callSession Table 

UniqueCallID | extensionID | 
---------------------------- 
A    123 
B    123 
C    123 

callSum table 

UniqueCallID | Duration | Answered | 
------------------------------------ 
A    10   1 
B    5   1 
C    15   0 

newReport table 

Extension | Total Talk Time | Total Calls | Missed Calls 
-------------------------------------------------------- 
123   30    3    1 

希望这正确传达我的想法。

如果我创建一个表来保存这些值,我需要知道如何根据该图选择,连接和插入这些东西,但我无法构造正确的查询/语句。

+1

嗨。你为什么要将'extensionID'保存在不同的表中? – Horaciux

+1

TL; DR;请参阅https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

回答

1

您只需加入两个表,然后在extensionID上做一个group。此外,添加公式来汇总和收集信息。

SELECT 
    `extensionID` AS `Extension`, 
    SUM(`Duration`) AS `Total Talk Time`, 
    COUNT(DISTINCT `UniqueCallID`) as `Total Calls`, 
    SUM(IF(`Answered` = 1,0,1)) AS `Missed Calls` 
FROM `callSession` a 
JOIN `callSum` b 
    ON a.`UniqueCallID` = b.`UniqueCallID` 
GROUP BY a.`extensionID` 
ORDER BY a.`extensionID` 
+0

非常感谢你,这正是我正在寻找的! –

+0

好,快速的问题:在未来,如果我加2列是这样的: SUM(IF(LEGTYPE1 =#))作为Total_Outbound ,SUM(IF(LegType1 =#))作为Total_Inbound 其中legtype1我想将所有'1'作为入站总数和全部'2'加入入站,我会分别用1,2,1和2,1,2替换井号吗?我对IF语句感到困惑 –

+1

@TomN。如果它适合你,请接受答案。 IF函数有三个参数。条件(评估为true/false),值为TRUE,值为FALSE。所以在你的例子中,你用#3代替#符号。该列等于(您的测试)的值,后跟逗号和1或0,另一个逗号以及第二个参数的相反值。 IOW,如果它是1,那么0或反之亦然。 –

1

可以使用由

select 
     a.extensionID 
     , sum(b.Duration) as Total_Talk_Time 
     , count(b.Answered) as Total_Calls 
     , count(b.Answered) -sum(b.Answered) as Missed_calls 
    from callSession as a 
    inner join callSum as b on a.UniqueCallID = b.UniqueCallID 
    group by a.extensionID 
+0

谢谢你,似乎工作很好。现在,一个快速添加/问题。如果我还需要加入'用户'表并匹配它与'callsession'表之间的extensionID,然后从'users'打印'extension'作为'4-Digit Extension',我会以c身份加入用户,然后放置选择中的c.extension? –

1

此连接和组应该做的伎俩。你被要求做的是聚合呼叫的数量和持续时间。除非明确要求,否则不需要创建新表来执行此操作。 JOIN和AGGREGATEs的正确组合将获得您需要的信息。这应该是相当简单的......唯一半有趣的部分是计算未接来电的数量,这是通过使用“CASE”语句作为每个来电是否应答的条件检查来完成的。

请原谅我的语法...我的经验是与SQL Server。

SELECT CS.Extension, SUM(CA.Duration) [Total Talk Time], COUNT(CS.UniqueCallID) [Total Calls], SUM(CASE CS.Answered WHEN '0' THEN SELECT 1 ELSE SELECT 0 END CASE) [Missed Calls] 
FROM callSession CS 
INNER JOIN callSum CA ON CA.UniqueCallID = CS.UniqueCallID 
GROUP BY CS.Extension