2013-12-12 2 views
0

У меня есть столбец, который хранит данные, как это:Подсчитайте количество вхождений ключевого слова в столбце, разделенном запятой?

продукта:
product1, product2, product5
product5, product7
product1

То, что я хотел бы сделать, это подсчитать количество вхождений там имеют product1, product2 и т. д., но там, где запись содержит несколько продуктов, я хочу, чтобы они их удвоили.

Таким образом, для приведенного выше примера итоговые суммы будут:
product1: 2
product2: 1
product5: 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 

Но что перечислены все различные комбинации продуктов, которые были найдены и сколько раз они были найдены ...

Эти продукты не меняются поэтому жесткое кодирование это нормально ...

EDIT: вот что сработало для меня.

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

Смежные вопросы