Отчетность о шахтах на основе одного месторождения и наличия двух значений - PullRequest
1 голос
/ 01 апреля 2011

Это в SQL Server 2005.

Я работаю в колл-центре, где записи о вызовах хранятся в таблице истории.Бизнес работает так, что агент (Agent1) принимает вызов, говорит с клиентом, а затем передает этот вызов какому-то случайному второму агенту (Agent2), чтобы он закрыл продажу.

В SQL данные показывают, что первый агент говорил с клиентом, а затем вызов завершился без утилизации.Вторая запись показывает новый вызов с новым HistoryID и показывает Agent1 и Agent2 в поле агента.

Вот пример того, как располагаются данные:

HistoryID| CallID  |   Date                |  Data                   |  Agent  
10940824 | 2149513 | 3/31/2011 12:20:01 PM | Call Data of the Record | agent1  
10940853 | 2149513 | 3/31/2011 12:23:17 PM | Call Data of the Record | agent1 agent2  

Agent1 & Agent2 на самом деле будет именем агента, последняя инициализация, поэтому Agent1 = bobs, Agent2 = annb.Вовлечено может быть много агентов, поэтому имена агентов Agent1 и Agent2, скорее всего, всегда будут разными.

Я пытаюсь составить некоторые отчеты, в первую очередь для агента Agent. Примеры отчетов:

Сколько переводов получил Agent2?
Гипотетически, я бы попросил SQL дать мне счетчик всех записей истории, где Agent2 является вторым человеком в записи (для данной даты или диапазона дат)

Добавление следующих возможных сценариев отчета:
Возможно выберите запись с двумя агентами, затем выберите предыдущую запись, где существует Agent1для CallID самостоятельно.Смысл, я работаю в обратном направлении с данными.Я прошу SQL найти два значения в поле «Агент», затем взять первое имя агента и CallID и извлечь предыдущую запись на основе этих двух значений.

Еще одно: я хотел бы получитьвсе записи, в которых есть агент1 и агент2, существуют в поле «Агент».

Если есть какая-либо дополнительная информация, которая требуется для лучшего ответа, пожалуйста, сообщите мне,

Ответы [ 4 ]

3 голосов
/ 01 апреля 2011

Вы можете захотеть создать VIEW, чтобы вы могли использовать его для многих других запросов:

CREATE VIEW CallRecordsAgents AS
( SELECT HistoryID
       , CallID 
       , Date
       , Data
       , LEFT( Agent+' ', CHARINDEX(' ', Agent+' ') - 1)
       AS Agent1
       , RTRIM(LTRIM( 
           SUBSTRING( Agent+' ', CHARINDEX(' ', Agent+' '), LEN(Agent+' '))))
       AS Agent2
  FROM CallRecords
)

После этого вопрос: " Сколько переводов получил Боб? ", будет решаться следующим образом:

SELECT COUNT(*) AS Transfers
FROM CallRecordsAgents 
WHERE Agent2 = "Bob"

И" Сколько переводов получил каждый агент? "будет:

SELECT Agent2
     , COUNT(*) AS TransfersReceived
FROM CallRecordsAgents 
GROUP BY Agent2

Извлечение Agent2 можно упростить (я думаю) с помощью:

       , RTRIM( SUBSTRING( Agent, LEN(Agent1)+2, LEN(Agent) ) )
       AS Agent2
2 голосов
/ 01 апреля 2011

Как сказал Абэ, это плохой дизайн базы данных, поскольку у вас есть одно поле, содержащее два значения.Тем не менее, я предполагаю, что вы не можете изменить дизайн БД.Поэтому ...

Если предположить, что таблица [CallRecords], а столбец, содержащий идентификаторы пользователя агента, - [Агенты], то:

SELECT *
FROM CallRecords
WHERE (CHARINDEX(' ', Agents, 0) > 0) AND (CHARINDEX(@Agent2UserID, Agents, 0) > CHARINDEX(' ', Agents, 0))

По сути, идея состоит в том, чтобы получить все записи, которыеиметь пробел и иметь идентификатор агента2 после пробела.

0 голосов
/ 01 апреля 2011

Лучший способ сделать это - , а не хранить два отдельных значения в одном столбце.Это создает трудности с отчетностью, о которых вы говорите.

Чтобы исправить это, потребуется реструктуризация базы данных и перемещение данных.Если у вас должно быть два значения в одном столбце, гораздо лучше иметь все ваши данные в нормализованном формате, а затем при необходимости можно денормализовать их в представления.

На самом деле вам нужно будет сделать довольно странные вещи, чтобы определить, что вы хотите получить второе значение в столбце varchar.Это также, вероятно, снизит производительность, поэтому, если вы когда-либо будете иметь дело с большим объемом данных, вам следует рассмотреть это раньше, а не позже.

0 голосов
/ 01 апреля 2011

Я бы получил количество записей, сгруппированных по агенту2.что-то вроде:

SELECT agent2, COUNT(*)
FROM yourTable
GROUP BY agent2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...