连接和选择多个表并创建新的列名

时间:2017-07-31 18:52:35

标签: mysql sql database join insert

我对MySQL过去标准查询的经验非常有限,但是当谈到连接和多个表之间的关系时,我有点问题。

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

我已经与它合作了一段时间来弄清楚电话系统的所有内容之间的关系我已经发现我需要把所有内容都拉出来但是我试图找到创建工作的正确方法加入。

我正在考虑为我需要的信息创建一个新表,其列名为:

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

我知道我需要从我的用户'开始使用扩展程序ID。表格并将其与' extensionID'匹配在我的callSession'。每个extensionID可能有多个实例,但每个实例都会创建一个新的' UniqueCallID'。

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

以下是我需要它做的一个例子:

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

希望能够恰当地传达我的想法。

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

3 个答案:

答案 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

答案 1 :(得分:1)

这应该可以解决问题。您被要求做的是聚合呼叫的数量和持续时间。除非明确请求,否则您无需创建新表来执行此操作。 JOIN和AGGREGATE的正确组合将获得您需要的信息。这应该是非常简单的...唯一有趣的部分是计算未接来电的数量,这是使用" 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

答案 2 :(得分:1)

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

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`