2013-12-12 289 views
0

我有存儲這樣的數據的列:計算逗號分隔列中關鍵字的出現次數?

產品:
產品1,產品2,產品5
產品5,產品7
產品1

我想什麼做的是計算出現的次數有是產品1,產品2等,但記錄包含多個產品時,我希望它對它們進行雙重計數。

因此,對於上面的例子中的總數將是:
產品1:2
產品2:1
產品5:2
產品7:1

我怎樣才能做到這一點?

我是想這樣的事情:

select count(case when prodcolumn like '%product1%' then 'product1' end) from myTable 

這讓我計數的產品1出現,但我怎麼延長這個要經過每一個產品?

我也嘗試過這樣的事情:

select new_productvalue, count(new_productvalue) from OpportunityExtensionBase 
    group by new_ProductValue 

但是,列出了被發現和他們有多少次發現產品的所有不同的組合...

這些產品不改變所以硬編碼沒問題...

編輯:這是什麼爲我工作。

WITH Product_CTE (prod) AS 
(SELECT 
    n.q.value('.', 'varchar(50)') 
    FROM (SELECT cast('<r>'+replace(new_productvalue, ';', '</r><r>')+'</r>' AS xml) FROM table) AS s(XMLCol) 
     CROSS APPLY s.XMLCol.nodes('r') AS n(q) 
    WHERE n.q.value('.', 'varchar(50)') <> '') 
    SELECT prod, count(*) AS [Num of Opps.] FROM Product_CTE GROUP BY prod 
+0

下一次在列中避免逗號分隔的值 –

+0

完全同意你的觀點,但這是我得到的,必須與不幸的工作:( – user2573690

回答

1

你有一個糟糕的,糟糕的數據結構,但有時候一個必須與此相關。你應該有一個單獨的表格存儲每對產品/任何對 - 這是關係方式。

with prodref as (
     select 'product1' as prod union all 
     select 'product2' as prod union all 
     select 'product5' as prod union all 
     select 'product7' as prod 
    ) 
select p.prod, count(*) 
from prodref pr left outer join 
    product p 
    on ','+p.col+',' like '%,'+pr.prod+',%' 
group by p.prod; 

這在大桌子上會很慢。而且,查詢不能使用標準索引。但是,它應該工作。如果你可以重組數據,那麼你應該。

+0

我同意,有一個逗號分隔值絕對不是我喜歡的東西,但這是我在這種情況下遇到了什麼。感謝代碼,但我最終發現了一些在線工作,對我更好,更新了我的原始文章。 – user2573690