Как заставить этот SQL-запрос работать (вычисляемый столбец с вложенным запросом)? - PullRequest
3 голосов
/ 09 ноября 2010

Я хочу, чтобы вычисляемый столбец имел значение true, если поле asofdate равно максимальному asofdate в таблице, в противном случае - false.Я попробовал следующее, но я получаю синтаксическую ошибку.Как правильно сделать это?

select 
case asofdate
when select max(asofdate) from sometable then 1
else 0
end 
from sometable

В качестве альтернативы, возможно ли иметь вычисляемый столбец вдоль линий

case asofdate
when END OF PREVIOUS MONTH then 1
else 0
end

Ответы [ 5 ]

3 голосов
/ 09 ноября 2010

Из статьи MSDN

Вычисляемый столбец вычисляется из выражения, которое может использовать другие столбцы в той же таблице.Выражение может быть именем не вычисляемого столбца, константой, функцией и любой их комбинацией, связанной одним или несколькими операторами. Выражение не может быть подзапросом.

Так что вы не можете создать вычисляемый столбец таким образом.

2 голосов
/ 09 ноября 2010

Вы не можете сделать это в вычисляемом столбце, поскольку вычисляемый столбец может быть вычислен только из значений других столбцов в той же записи.

Вместо этого вы можете сделать это в виде:

CREATE VIEW
        v_with_last
AS
SELECT  *, CASE asofdate WHEN MAX(asofdate) OVER () THEN 1 ELSE 0 END AS the_last
FROM    sometable

К сожалению, вы не можете проиндексировать это представление.

0 голосов
/ 09 ноября 2010

Я не знаю, будет ли это работать, но вы можете создать вычисляемый столбец с формулой «MAX (asofdate)», создать индекс для этого столбца, а затем создать представление, которое просто сравнивает вычисляемый столбец с asofdate. Возможно, не самое лучшее решение, но может быть немного лучше, чем просто выполнение подзапроса.

0 голосов
/ 09 ноября 2010

так что максимальное значение asofdate хранится в таблице с именем sometable верно?В этом случае вам не нужно проверять его, используя подзапрос для каждой записи.Вы можете сохранить его в переменной и затем проверить текущую дату до этого.

declare @maxAsOfDate datetime;

Select @maxAsOfDate = max(asofdate) from sometable;

Select case when asofdate >= @maxAsOfDate then 1 else 0 end from sometable

Приветствия!

0 голосов
/ 09 ноября 2010

В MS Sql Server

SELECT case asofdate 
    WHEN (SELECT MAX(asofdate) FROM sometable) THEN 1 
    ELSE 0 END
FROM sometable

РЕДАКТИРОВАТЬ на основе комментариев

Чтобы получить конец предыдущего месяца -

SELECT DATEADD(dd,-(DAY(asofdate)),asofdate)
...