2014-01-12 39 views
0

我想在查詢中在varchar列中的十進制值之間進行比較。 的比較應該是最大的,如果年齡低於最低年齡* 10組識別符號每個將varchar轉換爲查詢中的十進制和比較值

例如最高(年齡列是VARCHAR):

ID | Name | Age | GroupID 
-------------------------- 
1 | AAA | 10.1 | 1 
2 | BBB | 11 | 1 
3 | CCC | 31.2 | 1 
4 | DDD | 30.4 | 2 

這是我一直試圖做後尋找解決方案

SELECT TOP 10 * FROM Groups g 
JOIN People p1 ON p1.GroupID = g.ID 
JOIN People p2 ON p2.GroupID = g.ID 
WHERE CONVERT(DECIMAL(8,2),ISNULL(p1.Age,0)) > (CONVERT(DECIMAL(8,2),ISNULL(p2.Age,0)) * 10) 

在此先感謝!

+2

年齡真的是你的數據庫中的varchar?所以首先想到的是改變它! –

+0

不幸的是,我不能改變列類型.. – Asaf

回答

0

我想你想使用的窗口功能如下:

select t.* 
from (select t.*, 
      min(case when isnumeric(Age) = 1 then cast(Age as float) end) over 
       (partition by groupID) as minage 
     from table t 
    ) t 
where age > 10 * minage; 

case聲明有助於防止錯誤事件年齡的不是數字。另外,我的數字float對於年齡來說是一個足夠好的數據類型,儘管您也可以使用decimal

+0

首先感謝您的幫助!但是我得到「[Err] 42000 - [SQL Server]')'附近的語法不正確。」 – Asaf

+1

此語法對我來說是正確的。你能用表格的結構來編輯你的問題嗎?它看起來像年齡存儲在一個單獨的表格與其他列。 –