【问题标题】:Joining and selecting multiple tables and creating new column names连接和选择多个表并创建新的列名
【发布时间】:2017-07-31 18:52:35
【问题描述】:

我在过去的标准查询方面对 MySQL 的经验非常有限,但是在涉及多个表之间的连接和关系时,我遇到了一些问题。

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

我已经使用它一段时间来弄清楚电话系统的所有内容之间的关系,并且我发现了我需要如何将所有内容都提取出来,但我正在尝试找到正确的方法来创建工作以完成加入。

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

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

我知道我需要从“用户”表中的扩展 ID 开始,并将其与“呼叫会话”中的“扩展 ID”相匹配。每个 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

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

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

【问题讨论】:

标签: mysql sql database join insert


【解决方案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`

【讨论】:

  • 非常感谢,这正是我想要的!
  • 好的,快速提问:将来,如果我像这样添加 2 列: sum(if(LEGTYPE1 = #)) as Total_Outbound , sum(if(LegType1 = #)) as Total_Inbound where in legtype1 我想将所有 '1' 添加为总出站和所有 '2' 作为入站,我会分别用 1,2,1 和 2,1,2 替换井号吗?我对 IF 语句有点困惑
  • @TomN。如果它对您有用,请接受答案。 IF 函数接受三个参数。一个条件(评估为真/假)、一个值为 TRUE 和一个值为 FALSE。因此,在您的示例中,您将 # 符号替换为三件事。该列等于(您的测试)的值,后跟一个逗号和一个 1 或 0,另一个逗号,以及第二个参数的相反值。 IOW,如果为 1,则为 0,反之亦然。
【解决方案2】:

您可以使用加入和分组方式

  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

【讨论】:

  • 谢谢你,这似乎工作得很好。现在,一个快速的补充/问题。如果我还需要加入'users'表并在它和'callsession'表之间匹配extensionID,然后将'users'中的'extension'打印为'4-Digit Extension',我是否将用户加入c,然后放置c.extension 中的选择?
【解决方案3】:

这应该可以解决问题。您被要求做的是汇总通话次数和通话时间。除非明确要求,否则您不需要创建新表来执行此操作。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多