次の問題があります。あるテーブルには 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 でこれをシミュレートする方法を見つけることができます。クライアント専用の追加の Cognos クエリを作成し、それを結合してクエリをカウントし、結果を使用して表示することで、この問題を解決しました。1 つの COGNOS クエリでそれを行う方法があるかどうかを知りたいです。
SQL クエリを投稿しないでください。リストされている最初のクエリは、Cognos アプリケーションで実行しようとしているものです。
最初のクエリと同じ結果を得る別の方法を次に示します。
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