【问题标题】:Advanced SQL Select Query (unique rows) (group by)高级 SQL 选择查询(唯一行)(分组依据)
【发布时间】:2018-12-11 15:30:50
【问题描述】:

我的数据库正在保存我公司拨打的电话。
我需要做一个选择查询,选择所有唯一的人,并为每个人选择:

  • 呼入电话数
  • 外呼次数
  • 总来电
  • 平均通话时间

我试过这个,但在选择呼入和呼出电话时卡住了。
我将解释如何查看呼入或呼出的时间。

OriginationDevice 被填满时,它对DestinationName 的入站调用。
DestinationDevice 被填满时,它对OriginationName 的出站呼叫。

我需要每个 Unique DestinationNameOriginationName 并列出呼入、呼出和总呼叫的数量,当然还有平均呼叫时间。
我已经走了很远,但我似乎无法在一个查询中获得入站和出站。

查看我的SQL Fiddle,您可以在其中帮助我!
谁能帮我获取每个人的平均通话时间、呼出电话、呼入电话和总通话时间?

我的查询尝试:

SELECT * FROM (
   SELECT 
   IFNULL (SUM( CASE WHEN OriginationDevice != '' AND ConnectTime != '' THEN 
   DATEDIFF(ConnectTime, EndTime) ELSE null END ) /  COUNT(case when 
   OriginationDevice <> '' then 1 else null end), 0) as calltime,
   COUNT(case when OriginationDevice != '' then 1 else null end) as inbound,
   COUNT(case when DestinationDevice != '' AND OriginationDevice = '' then 1 
   else null end) as outbound,
   COUNT(*) as total,
   DestinationName

   FROM calls WHERE (YEAR(EndTime) = 2018 AND MONTH(EndTime) = 12) and 
   (OriginationDevice != '' or DestinationDevice != '')
   AND ConnectTime != ''  GROUP BY DestinationName
) as t1
WHERE total > 0  ORDER BY total DESC, calltime

这是表sql:

CREATE TABLE IF NOT EXISTS `calls` (
  `OriginationName` varchar(200) NOT NULL,
  `DestinationName` varchar(200) NOT NULL,
  `ConnectTime` DATETIME NOT NULL,
  `EndTime` DATETIME NOT NULL,
  `OriginationDevice` varchar(200) NOT NULL,
  `DestinationDevice` varchar(200) NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `calls` (`OriginationName`, `DestinationName`, `ConnectTime`, `EndTime`, `OriginationDevice`, `DestinationDevice`) VALUES
  ('Person 1', 'Person 5', '2018-12-11 11:26:12', '2018-12-11 11:26:18', '243', '(call routing)'),
  ('Person 2', 'Person 3', '2018-12-11 10:16:12', '2018-12-11 10:16:54', '', '(call routing)'),
  ('Person 5', 'Person 1', '2018-12-11 10:21:12', '2018-12-11 10:22:22', '', ''),
   ('Person 2', 'Person 1', '2018-12-11 11:26:12', '2018-12-11 11:26:52', '233', ''),
    ('Person 1', 'Person 4', '2018-12-11 12:26:12', '2018-12-11 12:28:25', '456', ''),
     ('', 'Person 1', '2018-12-11 14:56:12', '2018-12-11 14:57:24', '', '(call routing)'),
  ('Person 3', '', '2018-12-11 15:26:12', '2018-12-11 15:26:37', '223', '');

我的预期结果在查询中。

【问题讨论】:

  • SQLfiddle 很棒,但也将示例数据和预期结果放在这里,以及您的查询尝试。 (格式化文本,而不是图像。)
  • 你的 SQL Fiddle 不适合我,所以我看不到数据。
  • 这怎么可能?那它对我有什么作用?我在问题中添加了查询和表 sql
  • 明天看看有没有答案;)

标签: mysql sql


【解决方案1】:

这个应该按照你的要求做:

 SELECT 
    Person,
    SUM(case when typology = 'outbounds' then calls_number else 0 end) as outbounds,
    SUM(case when typology = 'inbounds' then calls_number else 0 end) as inbounds,
    SUM(calls_number) as calls_number,
    case when SUM(calls) = 0 then 0 else SUM(callTime) / SUM(calls) end as avgCallTime
FROM(
SELECT 
    OriginationName as Person,
    SUM(case 
        when DestinationDevice != '' and ConnectTime != '' then (EndTime - ConnectTime) 
        else 0 end
    ) as callTime,
    SUM(case when DestinationDevice != '' then 1 else 0 end) as calls_number,
    'outbounds' as typology
FROM calls 
WHERE (YEAR(EndTime) = 2018 AND MONTH(EndTime) = 12) and ConnectTime != ''
    and OriginationName != ''
GROUP BY OriginationName
    union
SELECT 
    DestinationName,
    SUM(case 
        when OriginationDevice != '' and ConnectTime != '' then (EndTime - ConnectTime) 
        else 0 end
    ),
    SUM(case when OriginationDevice  != ''  then 1 else 0 end),
    'inbounds' as typology
FROM calls 
WHERE (YEAR(EndTime) = 2018 AND MONTH(EndTime) = 12) and ConnectTime != '' 
    and DestinationName != ''
GROUP BY DestinationName) as T
GROUP BY Person;

如果有什么问题请告诉我,这个示例工作https://sqltest.net/#386096

【讨论】:

  • 我应该将哪些名称更改为我的数据库名称?我将原来的数据库名称更改为calls
  • 所以调用应该更改为我自己的数据库名称,在哪些地方?
  • 谢谢,它对我帮助很大!
  • 我不太清楚这个问题,表名是FROM关键字后面的字符串,你可以在这里更改调用字符串。您也可以修改在SELECT 部分中为调用号码提供的别名,我认识到给列和表提供相同的名称可能会造成混淆,我会根据答案进行调整。
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多