我有以下问题。在一个表中,我有一个带有ID的客户端列表,在另一个表中,我有一个这些客户端的呼叫列表。在数据模型中,我将关系标记为0到多个。 1客户端可以有0个或多个呼叫。当我创建我的查询时,我从客户端表中添加客户端ID和客户端名称,然后从“呼叫表”中添加计数。在过滤器部分,我对客户端ID进行过滤,并在“呼叫表”上的“日期范围”上进行过滤。
这样我只会得到有电话的客户和没有电话的客户没有出现在结果中。使用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中模拟这种方法的方法。我通过为客户端创建额外的认知查询来解决这个问题,而不是将其加入计数查询而不是使用结果来显示。我想知道是否有办法在1 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 :(得分:0)
如果您只想要有来电的客户,则必须将left outer join
替换为inner join
答案 1 :(得分: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