Расширенный запрос выбора SQL (уникальные строки) (сгруппированы по) - PullRequest
0 голосов
/ 11 декабря 2018

Моя БД сохраняет телефонные звонки, которые делает моя компания.Мне нужно сделать запрос на выборку, который выбирает всех уникальных людей, и для каждого человека он должен выбрать:

  • Количество входящих вызовов
  • Количество исходящих вызовов
  • Всегозвонки
  • Среднее время звонка

Я попробовал это и застрял при выборе входящих и исходящих звонков.Я объясню, как увидеть, когда вызов является входящим или исходящим.

Когда заполнен OriginationDevice, входящий вызов для DestinationName.Когда DestinationDevice заполнен, это исходящий вызов для OriginationName.

Мне нужны все уникальные DestinationName или OriginationName и перечисляются количество входящих, исходящих и общих звонков и, конечно, среднее время звонка.Я далеко продвинулся, но не могу получить входящий и исходящий запрос одним запросом.

Посмотрите мою 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', '');

Мой ожидаемый результат в запросе.

1 Ответ

0 голосов
/ 11 декабря 2018

Этот должен делать то, что вы просите:

 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...