2012-01-31 3 views
0

У меня есть следующая проблема. В одной таблице у меня есть список клиентов с идентификатором, в другой таблице у меня есть список вызовов для этих клиентов. В datamodel я обозначил отношения 0 для многих. 1 Клиент может иметь 0 или несколько вызовов. Когда я создаю свой запрос, я добавляю идентификатор клиента и имя клиента из таблицы клиентов, а затем добавляю счет из таблицы вызовов. В разделе фильтра у меня есть фильтр на идентификаторе клиента и фильтр по диапазону дат в таблице вызовов.Создание Left Outer Join Query in Cognos

Таким образом, я получаю только клиентов, которые имели вызовы и клиенты без звонков, не отображаются в результатах. С помощью SQL я написал один и тот же запрос для проверки результатов, и вот что я нашел.

Используя этот запрос, я получаю оба клиента, которые имеют вызовы и не имеют вызовов. Count (CallId) возвращает 0.

select ct.clientid 
,ct.ClientName 
,count(cs.callid) 
from client ct 
left outer join calls cs 
on ct.clientid = cs.clientid 
and cs.CallRecievedDateTime > '1/1/2012' 
and cs.CallRecievedDateTime < '1/2/2012' 
where ct.clientid in (1,2,5) 
group by ct.clientid, ct.ClientName 

Используя этот запрос, я получаю счета только для клиентов с вызовами. и клиенты без вызовов не отображаются в результатах

select ct.clientid 
,ct.ClientName 
,count(cs.callid) 
from client ct 
left outer join calls cs 
on ct.clientid = cs.clientid 
where ct.clientid in (1,2,5) 
and cs.CallRecievedDateTime > '1/1/2012' 
and cs.CallRecievedDateTime < '1/2/2012' 
group by ct.clientid, ct.ClientName 

я выяснял способ имитации этого в Cognos. Я решил эту проблему, создав дополнительные запросы cognos только для клиента, а затем присоединился к ней для подсчета запросов и использования результатов для отображения. Я хочу знать, есть ли способ сделать это в одном запросе COGNOS.

Пожалуйста, не публикуйте SQL-запросы. Первый указанный список - это то, что я пытаюсь сделать в Cognos Application.

вот еще один способ, чтобы получить те же результаты, что и первый запрос

SELECT ClientId, 
ClientName, 
counts 
FROM (SELECT clientid, 
ClientName 
FROM Client 
WHERE clientid in (1,2,5)) cd 
LEFT OUTER JOIN 
(SELECT clientid, 
COUNT(*) counts 
FROM calls cs 
WHERE cs.CallRecievedDateTime > '1/1/2012' 
AND cs.CallRecievedDateTime < '1/2/2012' 
GROUP BY clientid) b 
ON cd.clientid = b.clientid 

ответ

0

Если вы хотите только те клиенты, которые имели вызовы, Вы должны заменить left outer join с inner join

+0

Извините, я не должен был быть креаром. В настоящее время я получаю только звонки клиентов. Я хочу, чтобы клиент не звонил. –

0

Вы должны сделать:

select ct.clientid 
,ct.ClientName 
,count(cs.callid) 
from client ct 
left outer join calls cs 
on ct.clientid = cs.clientid 
where ct.clientid in (1,2,5) 
and cs.clientid not in (select ct.clientid from client ct inner join calls cs 
on ct.clientid = cs.clientid and cs.CallRecievedDateTime > '1/1/2012' 
and cs.CallRecievedDateTime < '1/2/2012') 
and cs.CallRecievedDateTime > '1/1/2012' 
and cs.CallRecievedDateTime < '1/2/2012' 
group by ct.clientid, ct.ClientName 
+0

Этот запрос не работает, это не имеет никакого смысла, вы исключаете всех клиентов из таблицы вызовов ?! –

+0

Вы правы, я его отредактировал. Я добавил внутреннее соединение к таблице вызовов в подзапросе. Теперь суб-запрос выбирает только клиент с вызовами, а «не в» выбирает, что вы хотите - клиент без звонков – TwTw

+0

Вы по-прежнему не получите никаких результатов. вы исключаете идентификатор клиента. В моем первом запросе я получаю все 3 идентификатора клиентов. 1,2,5, хотя 5 не имеет вызовов. в вашем запросе вы не получите никаких строк при возврате. –