如何编写SQL查询以记录呼叫中心操作?
我有两张桌子: 表1 历史如何编写SQL查询以记录呼叫中心操作?,sql,sql-server,Sql,Sql Server,我有两张桌子: 表1 历史 -------------------------------------------------------------------- Callplacetime | Finish Code | Address | Identidy 2018-09-26 16:29:08:000 | No Answer | ABC | 10
--------------------------------------------------------------------
Callplacetime | Finish Code | Address | Identidy
2018-09-26 16:29:08:000 | No Answer | ABC | 10
2018-10-15 12:37:08:000 | Voicemail | ABC | 10
2018-10-16 18:40:09:000 | No Answer | ABC | 10
2018-10-16 21:29:08:000 | No Answer | ABC | 10
2018-10-19 04:57:10:000 | Appointment Booked | ABC | 10
2018-09-26 16:29:57:000 | No Answer | XYZ | 20
2018-10-15 16:29:08:000 | Voicemail | XYZ | 20
2018-10-15 18:29:08:000 | Appointment Booked | XYZ | 20
2018-10-25 16:29:08:000 | Appointment Booked | MNO | 30
表2
列表
---------------------------------------------
Address | Identity
ABC | 10
XYZ | 20
MNO | 30
我希望数据显示为
Callplacetime | Finish Code | Address | Attempts by Agents
2018-09-26 16:29:08:000 | No Answer | ABC | Attemp1
2018-10-15 12:37:08:000 | Voicemail | ABC | Attemp2
2018-10-16 18:40:09:000 | No Answer | ABC | Attemp3
2018-10-16 21:29:08:000 | No Answer | ABC | Attemp4
2018-10-19 04:57:10:000 | Appointment Booked | ABC | Attemp5
2018-09-26 16:29:57:000 | No Answer | XYZ | Attemp1
2018-10-15 16:29:08:000 | Voicemail | XYZ | Attemp2
2018-10-15 18:29:08:000 | Appointment Booked | XYZ | Attemp3
2018-10-25 16:29:08:000 | Appointment Booked | MNO | Attemp1
因此,基本上,代理呼叫特定地址(客户)。如果他只给那个地址打了一次电话,那么“代理尝试”列会说“尝试1”,如果他第二次打同一个地址,那么“尝试2”,依此类推。代理最多可以尝试5次。当然,最近的“callplacetime”是代理的最新尝试
如何编写查询,根据上述场景添加代理尝试列?您可以使用窗口函数和字符串连接
select *,
'Attempt' + cast(row_number() over (partition by Address order by Callplacetime) as varchar)
from [History]
作为旁注,我不确定列表
表的用途。我希望您需要加入它,根据历史记录表中的标识
获取地址
。。。但是您将其包括在历史记录表中,因此我不确定ERD在这里是什么样子。您可以这样做
CREATE TABLE T
([Callplacetime] datetime, [Finish Code] varchar(18), [Address] varchar(3), [Identidy] int)
;
INSERT INTO T
([Callplacetime], [Finish Code], [Address], [Identidy])
VALUES
('2018-09-26 16:29:08', 'No Answer', 'ABC', 10),
('2018-10-15 12:37:08', 'Voicemail', 'ABC', 10),
('2018-10-16 18:40:09', 'No Answer', 'ABC', 10),
('2018-10-16 21:29:08', 'No Answer', 'ABC', 10),
('2018-10-19 04:57:10', 'Appointment Booked', 'ABC', 10),
('2018-09-26 16:29:57', 'No Answer', 'XYZ', 20),
('2018-10-15 16:29:08', 'Voicemail', 'XYZ', 20),
('2018-10-15 18:29:08', 'Appointment Booked', 'XYZ', 20),
('2018-10-25 16:29:08', 'Appointment Booked', 'MNO', 30);
SELECT Callplacetime,
[Finish Code],
Address,
'Attempt' +
CAST(ROW_NUMBER() OVER (PARTITION BY Identidy ORDER BY Callplacetime) AS VARCHAR(10)) [Attempts by Agents]
FROM T;
返回:
+---------------------+--------------------+---------+--------------------+
| Callplacetime | Finish Code | Address | Attempts by Agents |
+---------------------+--------------------+---------+--------------------+
| 26/09/2018 16:29:08 | No Answer | ABC | Attempt1 |
| 15/10/2018 12:37:08 | Voicemail | ABC | Attempt2 |
| 16/10/2018 18:40:09 | No Answer | ABC | Attempt3 |
| 16/10/2018 21:29:08 | No Answer | ABC | Attempt4 |
| 19/10/2018 04:57:10 | Appointment Booked | ABC | Attempt5 |
| 26/09/2018 16:29:57 | No Answer | XYZ | Attempt1 |
| 15/10/2018 16:29:08 | Voicemail | XYZ | Attempt2 |
| 15/10/2018 18:29:08 | Appointment Booked | XYZ | Attempt3 |
| 25/10/2018 16:29:08 | Appointment Booked | MNO | Attempt1 |
+---------------------+--------------------+---------+--------------------+
由于您的第一张表已经包含了Address
列,我看不出第二张表的目的是什么?您在第一篇文章中做得相当不错,但这将有助于您避免将来的否决票。我想您希望按callplacetime排序该顺序基于callplacetime。由于您按此顺序插入了数据,因此数据正常工作,但不能保证保持不变。但如果是你的话,是我派你来的。点击那个链接<代码>2018年10月15日12:37:08语音邮件
正在尝试1。然后在第二个查询中,您将看到我的查询如何正确运行…顺序确实很重要。。。如果他第二次调用同一个地址,那么尝试2等等,您的代码不会导致这种情况。第二个时间是第二个实例,由Callplacetime
列确定。这并不难,因为它的Identidy
列不是IDENTITY
,我认为您应该指定VARCHAR
:)的长度,通常是@Sami,但casting不像不指定那样默认为VARCHAR(8)<代码>选择强制转换(12316354166512316516516作为varchar)
。他们的历史记录表中也有地址
。关于Identity
你是对的,但是我确信这是一个输入错误,因为列表中的列名是不受欢迎的,但是你选择的答案是错误的。只是提醒一下。。。除非Sami更改查询,否则您将遇到问题