我正在尝试使用和内部联接连接三个表,并且如果已发送电子邮件,则具有一种更改颜色的内容。
以下是我的查询
SELECT IIF(COUNT Holdsent.job)>0, #STD, #RED) AS Colour, jobs.job, jobs.jobstatus, jobs.client, jobs.logdate
FROM jobs INNER JOIN clients ON clients.client = jobs.client INNER JOIN holdsent ON holdsent.job = jobs.job
WHERE (jobs.jobstatus = 'HOLD' OR jobs.jobstatus = 'CLIHOLD')
以下是我收到的错误
未找到预期的词汇元素:(缺少(在汇总函数中 [解析表达式(SELECT子句中的column1)] - 的位置 SQL语句中的错误是:1 SELECT IIF(COUNT Holdsent.job)> 0,#STD,#RED)AS COLOR,jobs.job, jobs.jobstatus,jobs.client,jobs.logdate FROM jobs INNER JOIN客户端 ON clients.client = jobs.client INNER JOIN holdsent ON holdsent.job = jobs.job WHERE(jobs.jobstatus ='HOLD'或jobs.jobstatus = 'CLIHOLD')
我是SQL的新手并且可以进行基本查询,但我不清楚IIF。提前感谢您提供的任何帮助。
答案 0 :(得分:3)
iif
是MS Access的一项特殊功能,SQL Server已开始支持最新版本。正确的SQL表单是case
语句。使用标准SQL编写的查询的改进版本是:
SELECT (case when COUNT(hs.job)>0 then #STD else #RED end) AS Colour,
j.job, j.jobstatus, j.client, j.logdate
FROM jobs j INNER JOIN
clients c
ON c.client = j.client INNER JOIN
holdsent hs
ON hs.job = j.job
WHERE j.jobstatus in ('HOLD', 'CLIHOLD')
答案 1 :(得分:0)
抱歉,我没有为此模拟测试表,但我认为你想对你的holdsent
表进行子查询以将计数值输入主查询,然后在IIF() function中使用三个参数。我没有做一个测试用例,但我认为这符合你的需求:
SELECT IIF((isnull(holdsentCount.jobCount,0)>0, #STD, #RED) AS Colour
, jobs.job
, jobs.jobstatus
, jobs.client
, jobs.logdate
FROM jobs
JOIN clients
ON clients.client = jobs.client
LEFT JOIN (select holdsent.job
, count(*) as jobCount
from holdsent
group by holdsent.job ) as holdsentCount
ON holdsentCount.job = jobs.job
WHERE (jobs.jobstatus = 'HOLD' OR jobs.jobstatus = 'CLIHOLD')
此外,使用isnull()包装holdsentCount.jobCount
,以便在子查询中未返回时返回0。
编辑:我不知道'#STD'或'#RED'是什么,所以我把它们原样留下了。