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],那么我们可能有bug要追;如果较早,则可能是在您使用的版本发布后添加了支持。研究发行说明可能有助于理解这一点。我没有检查它什么时候第一次可用。
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;