SQL 服务器 - 自加入
SQL Server - Self-Join
SQL 服务器:我需要生成一份具有预期结果的报告,如下所述。
我想我需要使用自连接来检索预期格式的数据。我已经遍历了所有自连接示例,但仍然无法找到适合我的问题的查询,因此想在这里提出问题。
我有三个这样的 table:
客户
ID CUSTOMERNAME PRODUCTINFO AGENTNUM TRANSID
1 Cust1 Mobile 1234 0001
2 Cust2 Laptop 1234 0002
3 Cust3 Camera 2345 0003
代理
ID AGENTNAME AGENTNUMBER
1 John 1234
2 Smith 2345
3 Will 3456
审计日志
ID TRANSID TYPE LOGDATA LOGTIME
1 0001 InquiryI Input data 10/02/2016 18:20:10
2 0001 InquiryO Output data 10/02/2016 18:20:35
3 0002 CreateI Input data 11/02/2015 10:03:50
4 0002 CreateO Output data 11/02/2016 10:04:10
5 0003 InquiryI Input data 15/02/2016 21:44:02
预期输出
TRANSID CUSTNAME PRODUCTINFO AGENTNAME TYPE INPUTLOGTIME INPUT OUTPUT
0001 Cust1 Mobile John Inquiry 10/02/2016 18:20:10 data data
0002 Cust2 Laptop John Create 11/02/2015 10:03:50 data data
0003 Cust3 Camera Smith Inquiry 15/02/2016 21:44:02 data
提到的 - "data" 包含有关发送的输入和接收的输出的信息。有时由于任何问题,不会像
Smith's
查询那样没有输出。
- 另外
TYPE
in AuditLog
table 存储为 InquiryI
和 InquiryO
,我认为我们可以使用 [=20 删除最后一个字符=].
- 还需要显示 INPUTLOGTIME,这是记录输入请求的时间。
我想我们需要使用 Agent
和 Customer
table 的内部连接以及 AuditLog
table 之间的自连接,但它不是按预期工作。
请帮忙。
您可以使用以下查询:
SELECT c.TRANSID, CUSTOMERNAME, PRODUCTINFO, AGENTNAME,
LEFT(al.TYPE, LEN(al.TYPE) - 1) AS TYPE,
MAX(CASE WHEN RIGHT(al.TYPE, 1) = 'I' THEN LOGDATA END) AS INPUT,
MAX(CASE WHEN RIGHT(al.TYPE, 1) = 'O' THEN LOGDATA END) AS OUTPUT,
MIN(CASE WHEN RIGHT(al.TYPE, 1) = 'I' THEN LOGTIME END) AS INPUTLOGTIME
FROM Customer AS c
INNER JOIN Agent AS a ON c.AGENTNUM = a.AGENTNUMBER
LEFT JOIN AuditLog AS al ON c.TRANSID = al.TRANSID
GROUP BY c.TRANSID, CUSTOMERNAME, PRODUCTINFO, AGENTNAME,
LEFT(al.TYPE, LEN(al.TYPE) - 1)
SQL 服务器:我需要生成一份具有预期结果的报告,如下所述。
我想我需要使用自连接来检索预期格式的数据。我已经遍历了所有自连接示例,但仍然无法找到适合我的问题的查询,因此想在这里提出问题。
我有三个这样的 table:
客户
ID CUSTOMERNAME PRODUCTINFO AGENTNUM TRANSID
1 Cust1 Mobile 1234 0001
2 Cust2 Laptop 1234 0002
3 Cust3 Camera 2345 0003
代理
ID AGENTNAME AGENTNUMBER
1 John 1234
2 Smith 2345
3 Will 3456
审计日志
ID TRANSID TYPE LOGDATA LOGTIME
1 0001 InquiryI Input data 10/02/2016 18:20:10
2 0001 InquiryO Output data 10/02/2016 18:20:35
3 0002 CreateI Input data 11/02/2015 10:03:50
4 0002 CreateO Output data 11/02/2016 10:04:10
5 0003 InquiryI Input data 15/02/2016 21:44:02
预期输出
TRANSID CUSTNAME PRODUCTINFO AGENTNAME TYPE INPUTLOGTIME INPUT OUTPUT
0001 Cust1 Mobile John Inquiry 10/02/2016 18:20:10 data data
0002 Cust2 Laptop John Create 11/02/2015 10:03:50 data data
0003 Cust3 Camera Smith Inquiry 15/02/2016 21:44:02 data
-
提到的
- "data" 包含有关发送的输入和接收的输出的信息。有时由于任何问题,不会像
Smith's
查询那样没有输出。 - 另外
TYPE
inAuditLog
table 存储为InquiryI
和InquiryO
,我认为我们可以使用 [=20 删除最后一个字符=]. - 还需要显示 INPUTLOGTIME,这是记录输入请求的时间。
我想我们需要使用 Agent
和 Customer
table 的内部连接以及 AuditLog
table 之间的自连接,但它不是按预期工作。
请帮忙。
您可以使用以下查询:
SELECT c.TRANSID, CUSTOMERNAME, PRODUCTINFO, AGENTNAME,
LEFT(al.TYPE, LEN(al.TYPE) - 1) AS TYPE,
MAX(CASE WHEN RIGHT(al.TYPE, 1) = 'I' THEN LOGDATA END) AS INPUT,
MAX(CASE WHEN RIGHT(al.TYPE, 1) = 'O' THEN LOGDATA END) AS OUTPUT,
MIN(CASE WHEN RIGHT(al.TYPE, 1) = 'I' THEN LOGTIME END) AS INPUTLOGTIME
FROM Customer AS c
INNER JOIN Agent AS a ON c.AGENTNUM = a.AGENTNUMBER
LEFT JOIN AuditLog AS al ON c.TRANSID = al.TRANSID
GROUP BY c.TRANSID, CUSTOMERNAME, PRODUCTINFO, AGENTNAME,
LEFT(al.TYPE, LEN(al.TYPE) - 1)