2014-01-14 1 views
0

Я пытаюсь объединить три таблицы с использованием и внутренним соединением и иметь содержимое одного цвета смены, если отправлено электронное письмо.Создание INNER Присоединяется к IIF

Ниже мой запрос

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') 

Ниже ошибка я получаю

Ожидаемое лексический элемент не найден: (отсутствует (в агрегатной функции [Синтаксический Expression (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. Заранее благодарю вас за любую помощь, которую вы можете предоставить.

+1

Вы используете MySQL или SQL Server? –

+0

@GordonLinoff Из сообщения об ошибке Я бы сказал, что это MS Sql Server ... –

+0

К сожалению, мы используем SQL Server – Aaron

ответ

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') 

Кроме того, оберните holdsentCount.jobCount с ISNULL(), так что она возвращает 0, если он не будет возвращен в подзапроса.

EDIT: Я не знаю, что такое #STD или #RED, поэтому я оставил их как есть.

+0

Спасибо всем за помощь. Я смог понять это. – Aaron

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

Как OP использовал 'WHERE (jobs.jobstatus = 'HOLD' ИЛИ ​​jobs.jobstatus = 'CLIHOLD')' не должно быть: 'WHERE j.jobstatus IN ('HOLD', 'CLIHOLD')' –

+0

@AndrewBickerton , , , Спасибо. Исправлена. –

+0

Разве обе они не будут одинаковыми? –

Смежные вопросы