Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Выборка одной даты из двух столбцов


Автор: ohota5476 12.6.2017, 08:49
Имеется таблица dbo.Abonent, в ней столбец DogovorEndPeriod - дата планируемого окончания договора, столбец DogovorDateCancel - дата досрочного расторжения договора, если таковая имеется (в противном случае значение null).
Необходимо получить столбец с датой реального окончания договора. Т.е. если в DogovorDateCancel значение не null, то берем дату из него, в противном случае - из DogovorEndPeriod.
Испробовал множество вариантов, решить задачу не получается. Один из последних приведен ниже:
Код

SELECT * FROM dbo.Abonent
IF dbo.Abonent.DogovorDateCancel IS NULL BEGIN
SELECT dbo.Abonent.DogovorDateCancel AS Data FROM dbo.Abonent
END
ELSE
SELECT dbo.Abonent.DogovorEndPeriod AS Data FROM dbo.Abonent

Выдает ошибку "Не удалось привязать составной идентификатор dbo.Abonent.DogovorDateCancel". Предполагаю, что сам подход изначально не правильный. Буду благодарен за помощь.

Автор: Akina 12.6.2017, 10:38
Код

SELECT ... , COALESCE(DogovorDateCancel, DogovorEndPeriod) AS Data
...

Автор: ohota5476 12.6.2017, 14:41
Спасибо, работает. Также нашел еще один вариант решения данной задачи.
Код

SELECT ISNULL(DogovorDateCancel , DogovorEndPeriod) as Data, * FROM Abonent

Автор: ohota5476 12.6.2017, 20:13
Код

SELECT COALESCE (DogovorDateCancel, DogovorEndPeriod) AS Data FROM dbo.Abonent

Data является реальной датой расторжения договора. Ее необходимо сравнить с датой оплаты PayData. Если дата оплаты меньше даты расторжения договора, то вывести в Dolg значение поля SumDT (выставленный счет), иначе вывести в Dolg это DocKT.SumDT-DocKT.SumKT (выставленный-оплаченный).

Пытался набросать типа
Код

IF dbo.DocKT.PayDate<Data BEGIN 
SELECT SumDT AS Dolg FROM dbo.DocKT
END
ELSE
SELECT SumDT-SumKT AS Dolg FROM dbo.DocKT

Не позволяет сравнить dbo.DocKT.PayDate<Data. К тому же, не знаю, как это лучше к первому запросу прикрутить. Понимаю, что надо много еще чего изучить, но сейчас стоит данная задача, которую необходимо решить. Буду благодарен за помощь.

Автор: Akina 13.6.2017, 09:14
IF - это ветвление выполнения в процедуре. В рамках одного запроса для альтернативной выборки в зависимости от условия следует использовать CASE:
Код

SELECT CASE WHEN (condition) THEN (value when true) ELSE (value when false) END, ...


Цитата(ohota5476 @  12.6.2017,  15:41 Найти цитируемый пост)
нашел еще один вариант решения данной задачи.

ISNULL - это та же COALESCE, но со строго 2 параметрами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)