2016-02-16 7 views
0

SQL Server: Мне нужно создать отчет с ожидаемым результатом, как указано ниже.SQL Server - Self-Join

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

У меня есть три таблицы, как это:

клиентов

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 

Audit Log

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 
  • «данные», упомянутые содержит информацию о входе, который был отправлен и выход, который был получен. Иногда из-за какой-либо проблемы не было выхода, например, в случае запроса Smith's.
  • Также TYPE в AuditLog таблица хранится как InquiryI и InquiryO, что, я думаю, мы можем удалить последний символ, используя SUBSTRING.
  • Необходимо также показать INPUTLOGTIME, время, в которое был зарегистрирован входной запрос.

Я думаю, нам нужно будет использовать внутреннее соединение с Agent и Customer столом и автообъединение между AuditLog столом, но не работает, как ожидалось.

Помогите пожалуйста.

+1

идти вперед и вставьте SQL вы в настоящее время пытается получить работу – JsonStatham

+1

Что вы пробовали? Как узнать, какая строка аудита принадлежит данному TransID? Кажется, у вас есть разъединение. Вы можете получить запрос, который получит все данные в виде строк? Оттуда вам нужно повернуть или перетащить вкладку, чтобы получить свои столбцы. –

+0

Привет @SeanLange .. Извините, что я ошибочно вошел в AgentNum в таблице AuditLog, на самом деле есть TransactionID в AuditLog. Спасибо, что указали это. :) – vnkotak

ответ

1

Вы можете использовать следующий запрос:

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) 
+0

Привет @GiorgosBetsos .. Ваш запрос работает, но я сожалею, что пропустил еще один столбец TIME в отчете. Мне также нужно показать LogTime, поэтому, когда я использую GROUP BY с этим, ваш запрос не работает, и он показывает две строки, где в одной строке вывод является нулевым, а в другом - входным. Любая помощь .. – vnkotak

+0

он сделал трюк .. Спасибо, парень :) – vnkotak