2013-05-22 29 views
1

我有一個表包含字段中的ID。它看起來像:字段中的SQL計數ID

FieldName 
------------------------- 
1,8,2,3,4,10,5,9,6,7 
------------------------- 
1,8 
------------------------- 
1,8 

我需要計算這些ID來獲得結果:

ID | Count 
---|------ 
1 | 3 
8 | 3 
2 | 1 
3 | 1 

任何想法?

謝謝!

+2

如果您修復您的數據庫結構,這是微不足道的。您不應該在數據庫中存儲逗號分隔列表。 –

+0

當然!但它早已被創造出來,我不想對它進行改造。 – Victor

回答

3

試試這個:

Declare @demo table(FieldName varchar(100)) 

insert into @demo values('1,8,2,3,4,10,5,9,6,7') 
insert into @demo values('1,8') 
insert into @demo values('1,8') 


select ID, COUNT(id) ID_count from 
(SELECT 
    CAST(Split.a.value('.', 'VARCHAR(100)') AS INT) AS ID 
FROM 
(
SELECT CAST ('<M>' + REPLACE(FieldName, ',', '</M><M>') + '</M>' AS XML) AS ID 
    FROM @demo 
) AS A CROSS APPLY ID.nodes ('/M') AS Split(a)) q1 
group by ID 

我喜歡,因爲更快的執行速度的Devart的答案。這裏是一個修改的earlier answer,以滿足您的需求:

Declare @col varchar(200) 

SELECT 
@col=(
     SELECT FieldName + ',' 
     FROM @demo c 

     FOR XML PATH('') 
    ); 


;with demo as(


select cast(substring(@col,1,charindex(',',@col,1)-1) AS INT) cou,charindex(',',@col,1) pos 

    union all 
    select cast(substring(@col,pos+1,charindex(',',@col,pos+1)-pos-1)AS INT) cou,charindex(',',@col,pos+1) pos 
    from demo where pos<LEN(@col)) 
select cou ID, COUNT(cou) id_count from demo  
group by cou 
+0

@Victor:這有幫助嗎? –

+0

它看起來很好,謝謝! – Victor

+0

如果接受,請將其標記爲接受的答案 –

3

嘗試這一個 -

查詢:

SET NOCOUNT ON; 

DECLARE @temp TABLE (txt VARCHAR(8000)) 

INSERT INTO @temp (txt) 
VALUES ('1,8,2,3,4,10,5,9,6,7'), ('1,8'), ('1,8') 

SELECT 
     t.ID 
    , [Count] = COUNT(1) 
FROM (
    SELECT 
      ID = 
      SUBSTRING(
        t.string 
       , number + 1 
       , ABS(CHARINDEX(',', t.string, number + 1) - number - 1) 
      ) 
    FROM (
     SELECT string = (
      SELECT ',' + txt 
      FROM @temp 
      FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)') 
    ) t 
    CROSS JOIN [master].dbo.spt_values n 
    WHERE [type] = 'p' 
     AND number <= LEN(t.string) - 1 
     AND SUBSTRING(t.string, number, 1) = ',' 
) t 
GROUP BY t.ID 
ORDER BY [Count] DESC 

輸出:

ID Count 
----- ----------- 
1  3 
8  3 
9  1 
10 1 
2  1 
3  1 
4  1 
5  1 
6  1 
7  1 

查詢費用:

proff

+0

更多這一個字符的數字在這裏產生問題。 –

+0

謝謝,但它計數的數字,而不是逗號分隔的ID。 – Victor

+0

現在,它的工作,謝謝! – Victor