我正在使用informix,我无法在聚合函数中使用CASE语句。它总是抛出错误(-201:发生语法错误)。以下是我正在使用的查询。
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
inner join agentconnectiondetail acd on ccd.sessionid=acd.sessionid
你能解释一下是什么问题吗?
答案 0 :(得分:1)
以下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;
由于它会为您生成-201语法错误,因此我们可以推断您使用的是旧版本的Informix。这可能意味着您需要升级到更新版本的Informix。 (根据Copilot评论中的信息,看来Informix 11.50不支持该表示法;只有11.70表示。)
如果您使用的是Informix 11.70,则需要准确记录您正在使用的版本以及运行它的平台。如果它是11.70.xC [4-7],那么我们可能有一个追逐的错误;如果它更早,则可能已添加支持,因为您使用的版本已发布。学习发行说明可能有助于理解这一点。我没有检查它何时首次可用。
我观察到,当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;
答案 1 :(得分:0)
对我来说似乎是一个IDS错误。 我尝试了类似的查询(嵌套在count函数中的情况),这总是在'when'关键字上给出语法错误。 但是,根据官方documentation,这应该有效。