计算逗号分隔列中关键字出现次数?

时间:2013-12-12 21:22:02

标签: sql sql-server count

我有一个存储数据的列:

产品:
    产品1,产品2,产品5
    产品5,产品7
    product1

我想要做的是计算product1,product2等的出现次数,但记录中包含多个产品,我想让它重复计算。

因此,对于上面的例子,总数将是:
    product1:2
    product2:1
    产品5:2
    product7:1

我怎样才能做到这一点?

我正在尝试这样的事情:

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

这让我看到了product1的计数,但是如何扩展它以通过每个产品?

我也试过这样的事情:

    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

2 个答案:

答案 0 :(得分: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;

在大桌子上这会很慢。而且,查询无法使用标准索引。但是,它应该工作。如果你可以重组数据,那么你应该。

答案 1 :(得分:0)

如果有一个分割功能,请不要理解你所需要的一切 SQL query to split column data into rows

希望在此之后你可以管理。