2013-09-01 20 views
1

我的表master_schedule如何計算字符串中的每個字符,以表格形式顯示每個實例

cable_no 
D110772 
D110773 
D110774 
D110775 
D110776 
D110777 
D110778 
D110779 
D110880 

我想創建一個循環,使每個字符串中的字符數和顯示

D 9 
1 18 
2 1 
3 1 
AND SO ON ....... 
我如何修改如下提到的這些SQL查詢:
select (sum(LEN(cable_no) - LEN(REPLACE(cable_no, 'D', '')))*2) as FERRUL_qtyx2 
from MASTER_schedule 

回答

0

您可以使用recursive common table expression

with cte(symbol, cable_no) as (
    select 
     left(cable_no, 1), right(cable_no, len(cable_no) - 1) 
    from Table1 

    union all 

    select 
     left(cable_no, 1), right(cable_no, len(cable_no) - 1) 
    from cte 
    where cable_no <> '' 
) 
select symbol, count(*) 
from cte 
group by symbol 

=> sql fiddle demo

的另一種方法(後戈登·利諾夫溶液製造):

;with cte(n) as (
    select 1 
    union all 
    select n + 1 from cte where n < 7 
) 
select substring(t.cable_no, n.n, 1) as letter, count(*) as cnt 
from #Table1 as t 
    cross join cte as n 
group by substring(t.cable_no, n.n, 1); 

=> sql fiddle demo

1

像這樣:

select substring(cable_no, n.n, 1) as letter, count(*) as cnt 
from FERRUL_qtyx2 t cross join 
    (select 1 as n union all select 2 union all select 3 union all select 4 union all 
     select 5 union all select 6 union all select 7 
    ) n 
group by substring(cable_no, n.n, 1); 

氏s會創建一個數字序列n,直到字符串的長度。然後它使用cross joinsubstring()來提取每個cable_no的第n個字符。

一般來說,這會比做union all七次更快。 union all方法通常會掃描該表7次。這將只掃描一次表格。

+0

+1,測試了我的和你的解決方案,你的實際速度更快。增加了另一個沒有硬編碼的數字(我知道spt_values,只是不喜歡它)。 –

相關問題