2010-11-09 88 views
3

我想要一個計算列,如果字段asofdate等於表中的最大值asofdate,則爲真,否則爲false。我嘗試了以下,但我得到一個語法錯誤。什麼是正確的方法來做到這一點?如何使這個SQL查詢工作(計算列與嵌套查詢)?

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

或者,是有可能有根據的意見

要獲得

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 
+0

你正在使用什麼數據庫? – rwilliams 2010-11-09 16:49:21

+0

你應該指定你正在談論什麼類型的SQL引擎(Oracle,SQL Server,MySQL等)。 – rsenna 2010-11-09 16:51:54

+0

@ r-dub,@rsenna:抱歉的人,SQL Server。 – Arlen 2010-11-09 16:59:03

回答

2

您不能在計算列中執行此操作,因爲計算列只能從相同記錄中其他列的值計算。

你可以做一個視圖,而不是:

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

不幸的是,你不能索引這一觀點。

+0

這是有幫助的,並且是一個可能的選項。兩個問題。 1.什麼是「OVER」? 2.在計算列上是否有優點(我可以通過使用此答案使其成爲計算列:http://stackoverflow.com/questions/4136197/how-do-i-make-this- SQL查詢功計算-列與嵌套查詢/ 4136267#4136267)。 – Arlen 2010-11-09 17:36:50

+0

@Arlen:您鏈接的答案中的子查詢不能用於計算列。如果你正在談論'DATEADD',那是另一回事。 'OVER'是這種被稱爲窗口函數的標記:http://msdn.microsoft.com/en-us/library/ms189461.aspx – Quassnoi 2010-11-09 17:41:55

0

線在MS SQL Server計算列上個月底 -

SELECT DATEADD(dd,-(DAY(asofdate)),asofdate) 
+0

這樣做的作用在於它產生了正確的結果,但作爲計算列是不可接受的。有沒有辦法做到這一點作爲一個計算列? – Arlen 2010-11-09 16:58:33

+0

你是什麼意思?如從某些選擇max(date1 - date2)? – Kamal 2010-11-09 17:02:05

+0

我的意思是,如果你嘗試'case asofdate when select(max(asofdate)from sometable)then 1 else 0 end' as a computed column SQL Server is not happy。該消息是:「在此上下文中不允許使用子查詢,只允許使用標量表達式。」如果'asofdate'等於表中所有'asofdate'的最大值,基本上我需要這個列是真實的。另一種針對我的目的(也就是由於某些商業規則)等同的方式是,如果'asofdate'是'> ='上個月的結尾。 – Arlen 2010-11-09 17:03:40

0

所以asofdate的最大值是存儲在一個名爲sometable的表中嗎?在這種情況下,您不必使用每個記錄的子查詢來檢查它。您可以將其存儲在一個變量中,然後檢查當前的最新日期。

declare @maxAsOfDate datetime; 

Select @maxAsOfDate = max(asofdate) from sometable; 

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

乾杯!

+0

計算列可以嗎? – Arlen 2010-11-09 16:56:01

+0

是的,我在MS-SQL 2008上使用int數據類型的測試表對其進行了檢查。 – 2010-11-09 17:05:11

+0

我不明白。我嘗試過'聲明@ KeyCorpLOBmaxDate datetime;從keycorplob中選擇@KeyCorpLOBmaxDate = max(prd_d);當@KeyCorpLOBmaxDate then 1 else 0 end'作爲計算列的公式時(在SQL Server Management Studio中),我得到錯誤「關鍵字''declare''附近的錯誤語法。 關鍵字''附近的語法不正確case''「。 – Arlen 2010-11-09 17:11:44

3

MSDN article

計算列是從 表達,可以在同一個表中使用的其它列 計算。表達式可以是未計算的列名稱, 常量,函數和任何 的組合,這些組合由一個 或更多運算符連接。 表達式不能是子查詢。

所以,不,你不能這樣做一個計算列。

+0

這就是我所懷疑的。無論如何要把上個月的結尾作爲一個標量,以便它可以在計算列中使用嗎? (當前日期可能是一個標量。) – Arlen 2010-11-09 17:09:45

+0

您不能以標量的形式獲取*前一個*月份的結尾,因爲這會使其不確定。但是,如果您可以通過,則可以在給定的月份結束。如果該方法的簽名是'Create Function [dbo]。[GetEndOfPreviousMonth](@ SomeDate datetime)' – 2010-11-09 18:19:13

0

我不知道這是否可行,但你可以創建一個公式爲'MAX(asofdate)'的計算列,在該列上創建一個索引,然後創建一個視圖,將計算列與asofdate進行比較。也許不是最好的解決方案,但可能比僅僅做一個子查詢稍好。