Informix 11.70 では、集約内で CASE が許可されます
次の SQL は、Mac OS X 10.7.5 上の Informix 11.70.FC6 (RHEL 5 上の 11.70.FC4 も) で機能します。
CREATE TEMP TABLE contactcalldetail
(
contacttype INTEGER NOT NULL,
contactdisposition INTEGER NOT NULL,
sessionid INTEGER NOT NULL
);
CREATE TEMP TABLE agentconnectiondetail
(
sessionid INTEGER NOT NULL
);
SELECT NVL(COUNT(CASE
WHEN (ccd.contacttype = 1 AND ccd.contactdisposition = 2)
THEN (ccd.sessionid)
ELSE 0 END),
'ELSED (att)') AS calls
FROM contactcalldetail ccd
JOIN agentconnectiondetail acd ON ccd.sessionid = acd.sessionid;
Informix 11.50 以前では
-201 構文エラーが生成されるため、古いバージョンの Informix を使用していると推測できます。これはおそらく、新しいバージョンの Informix にアップグレードする必要があることを意味します。( Copilotのコメントからの情報に基づくと、Informix 11.50 はこの表記法をサポートしていないようです。サポートしているのは 11.70 だけです。)
Informix 11.70 を使用している場合は、使用しているバージョンと、それを実行しているプラットフォームを正確に文書化する必要があります。11.70.xC[4-7] の場合は、追跡すべきバグがある可能性があります。以前の場合は、使用しているバージョンがリリースされてからサポートが追加された可能性があります。リリース ノートを調べると、これを理解するのに役立つ場合があります。いつ発売されたかは調べていません。
COUNT が NULL を返すことはありますか?
COUNT が NULL を返す状況はないと思います。確かに、空のテーブルでは、上記のクエリの次のバリアントの出力は、すべての値に対してゼロを返します。したがって、NVL関数呼び出しは不要だと思います。
SELECT NVL(COUNT(CASE
WHEN (ccd.contacttype = 1 AND ccd.contactdisposition = 2)
THEN (ccd.sessionid)
ELSE 0 END),
'ELSED (att)') AS calls,
COUNT(*) AS count1,
COUNT(CASE
WHEN (ccd.contacttype = 1 AND ccd.contactdisposition = 2)
THEN (ccd.sessionid)
ELSE 0 END) AS count2
FROM contactcalldetail ccd
JOIN agentconnectiondetail acd ON ccd.sessionid = acd.sessionid;