Замещение одного значения на другое во View

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Agata-Net-lady
Сообщения: 3
Зарегистрирован: 20 май 2008, 13:52

Необходимо во view сделать так, чтобы в выводимой колонке выводилось значение 'заявка закрыта' если в одном из полей в таблице стоит значение 'closed'.
Т.е. вместо steps.Name AS [Текущий этап], нужно поставить чтото вроде: if BPMS.dbo.WRunFlow.TypeFlow = 'Close' then REPLACE(steps.Name, '%', 'Бизнес процесс завершен') AS [Текущий этап]
Но видимо if не работает в селекте. Функцией тоже не получается.

Сам запрос:
SELECT BPMS.dbo.WRunFlow.TypeFlow AS Чернослив, dbo.OT189.CardID, dbo.OT189.RegNum AS [Рег № проекта],
BPMS.dbo.WRunFlow.DateCreation AS [Дата регистрации], dbo.OT189.OT189_F1911 AS [Предмет договора],
dbo.Korrespondent.OrgName AS Контрагент, ISNULL(Сотрудник2.Surname, '') + ' ' + ISNULL(Сотрудник2.Name, '')
+ ' ' + ISNULL(Сотрудник2.MName, '') AS [Ответственный исполнитель], ISNULL(back_count.c, 0) AS [Возвратов на доработку]
, steps.Name AS [Текущий этап], ISNULL(stepEmpl.Surname, '') + ' ' + ISNULL(stepEmpl.Name, '') + ' ' + ISNULL(stepEmpl.MName, '')

AS [Текущий исполнитель], ISNULL(CONVERT(nvarchar(200), steps.DateOpen, 104) + ' ' + CONVERT(nvarchar(10), steps.DateOpen, 108), '')
AS [Дата открытия]
FROM dbo.OT189 LEFT OUTER JOIN
dbo.Korrespondent ON dbo.Korrespondent.Id = dbo.OT189.idKorrespondent_eecbfa5c_b670_41bc_84e0_1e04d651350e INNER JOIN
BPMS.dbo.WRunFlow ON BPMS.dbo.WRunFlow.IDOuterObject = dbo.OT189.CardID INNER JOIN
(SELECT acts1.ID, acts1.IDRunFlow, acts1.IDStep, acts1.Name, acts1.Description, acts1.Type, acts1.DateCreation, acts1.DateOpen,
acts1.DateClose, acts1.DateLastChange, acts1.LastUserID, acts1.Empl, acts1.LastStepID, acts2.runID, acts2.dateCreat
FROM BPMS.dbo.WActsLog AS acts1 INNER JOIN
(SELECT IDRunFlow AS runID, MAX(DateCreation) AS dateCreat
FROM BPMS.dbo.WActsLog
GROUP BY IDRunFlow) AS acts2 ON acts1.IDRunFlow = acts2.runID AND acts1.DateCreation = acts2.dateCreat) AS steps ON
steps.IDRunFlow = BPMS.dbo.WRunFlow.ID LEFT OUTER JOIN
dbo.Сотрудник AS stepEmpl ON stepEmpl.PersonID = steps.LastUserID INNER JOIN
dbo.Сотрудник AS Сотрудник2 ON Сотрудник2.PersonID = dbo.OT189.idWorkers_4cd3957c_3cca_4eb2_8615_13d6bf150a02 INNER JOIN
(SELECT RegNum, ISNULL(OT189_F1975, '1') AS a
FROM dbo.OT189 AS OT189_1) AS status2 ON status2.RegNum = dbo.OT189.RegNum LEFT OUTER JOIN
(SELECT IDRunFlow, COUNT(*) AS c
FROM BPMS.dbo.WActsLog AS WActsLog_1
WHERE (Name LIKE '%устранение%')
GROUP BY IDRunFlow) AS back_count ON back_count.IDRunFlow = BPMS.dbo.WRunFlow.ID
WHERE (BPMS.dbo.WRunFlow.TypeFlow <> 'Close')

Понимаю что в чужом коде никто не любит ковыряться, но думаю кто наверняка знает как это сделать, сможет помочь.
Зарание благодарю
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

ничего не гарантирую, можно попытаться так:
CASE WHEN BPMS.dbo.WRunFlow.TypeFlow = 'Close' then 'CLOSED' else '-' END AS [Текущий этап]
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

тип сервера было бы неплохо указать

у многих есть функция IIF(условие, если да, если нет)

IIF(BPMS.dbo.WRunFlow.TypeFlow = 'Close',REPLACE(steps.Name, '%', 'Бизнес процесс завершен'), 'не Close') AS [Текущий этап]
Изображение
Agata-Net-lady
Сообщения: 3
Зарегистрирован: 20 май 2008, 13:52

Спасибо большое!!!!!!!!!!
Ответить