使用IIF创建INNER联接

时间:2014-01-14 17:14:36

标签: sql sql-server

我正在尝试使用和内部联接连接三个表,并且如果已发送电子邮件,则具有一种更改颜色的内容。

以下是我的查询

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。提前感谢您提供的任何帮助。

2 个答案:

答案 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'是什么,所以我把它们原样留下了。