2014-02-15 59 views
0

我處理它有這樣的如何聚合來自一個字符串列數在SQL

ID cid Score 
1 1 3 out of 3 
2 1 1 out of 5 
3 2 3 out of 6 
4 3 7 out of 10 

我想要的總金額和得分列的百分比這樣在CID分組值設計不良的數據庫列

cid sum   percentage 
1  4 out of 8  50 
2  3 out of 6  50 
3  7 out of 10  70 

我該怎麼做?

+0

重新設計表格。將列分成兩部分有多難? –

+0

絕對同意,但我需要一個快速修復,直到我這樣做,任何想法? – Slartibartfast

回答

1

你可以試試這個方法:

select 
    t.cid 
    , cast(sum(s.a) as varchar(5)) + 
     ' out of ' + 
     cast(sum(s.b) as varchar(5)) as sum 
    , ((cast(sum(s.a) as decimal))/sum(s.b))*100 as percentage 
from MyTable t 
    inner join 
    (select 
    id 
    , cast(substring(score,0,2) as Int) a 
    , cast(substring(score,charindex('out of', score)+7,len(score)) as int) b 
    from MyTable 
    ) s on s.id = t.id 
group by t.cid 

[SQLFiddle Demo]

0

重新設計表格,但即時的CTE。這裏的解決方案並不像你能做到的那麼簡短,但是它利用了便捷的SQL Server函數PARSENAME。如果要截斷而不是舍入,或者如果您希望它是十進制值,而不是整數,則可能需要調整百分比計算。

在這個或大多數任何解決方案中,您必須指望Score的列值爲您所顯示的特定格式。如果您有任何疑問,您應該進行其他檢查,以免錯過或誤解任何內容。

with 
P(ID, cid, Score2Parse) as (
    select 
    ID, 
    cid, 
    replace(Score,space(1),'.') 
    from scores 
), 
S(ID,cid,pts,tot) as (
    select 
    ID, 
    cid, 
    cast(parsename(Score2Parse,4) as int), 
    cast(parsename(Score2Parse,1) as int) 
    from P 
) 
    select 
    cid, cast(round(100e0*sum(pts)/sum(tot),0) as int) as percentage 
    from S 
    group by cid; 
相關問題