我有一张包含以下样本数据的表格:
**CategoriesIDs RegistrantID**
47 1
276|275|278|274|277 4
276|275|278|274|277 16261
NULL 16262
NULL 16264
NULL 16265
NULL 16266
NULL 16267
NULL 16268
NULL 16269
NULL 16270
276|275|278 16276
276|275|278|274|277 16292
276|275|278|274|277 16293
276|275|278|274|277 16294
276|275|278|274|277 16295
276|275|278|274|277 16302
276|275|278|274|277 16303
276|275|278|274|277 16304
276|275|278|274|277 16305
276|275|278|274|277 16306
276|275|278|274|277 16307
我需要知道:
1)。哪个类别有多少注册商(如277有多少注册商) 2)。按类别对注册人进行分组,以便我可以找到哪些注册人属于277类别
我是否需要创建一个从csv生成表的函数?我创建了一个函数,但不确定它是否适用于IN子句的这种情况。
请建议
答案 0 :(得分:0)
如果您正在寻找
以下的输出Category Reg Count
277 12
274 12
47 1
276 13
278 13
275 13
试试这个
SELECT Category,COUNT([RegistrantID]) AS [Reg Count] FROM
(
SELECT
Split.a.value('.', 'VARCHAR(100)') AS Category
,[RegistrantID]
FROM
(
SELECT
CONVERT(XML,'<C>'+REPLACE([CategoriesIDs],'|','</C><C>') + '</C>') AS Categories
, [RegistrantID]
FROM table1
) T CROSS APPLY Categories.nodes('/C') AS Split(a)
) T1
GROUP BY Category
答案 1 :(得分:0)
您应该规范化数据。
那说,试试这个。
;with c as (
select RegistrantID, CategoriesIDs, 0 as start, CHARINDEX('|', CategoriesIDs) as sep
from yourtable
union all
select RegistrantID,CategoriesIDs, sep, CHARINDEX('|', CategoriesIDs, sep+1) from c
where sep>0
)
select *, count(*) over (partition by CategoriesID)
from
(
select convert(int,SUBSTRING(CategoriesIDs,start+1,chars)) as [CategoriesID],
RegistrantID
from
(
select *,
Case sep when 0 then LEN(CategoriesIDs) else sep-start-1 end as chars
from c
) v
) c2
order by CategoriesID
答案 2 :(得分:0)
如果您有“类别”表,则可以使用以下查询执行此操作:
select c.CategoryId, count(*)
from t join
categories c
on ','+cast(c.CategoryId as varchar(255))+',' like '%,'+CategoriesId+',%'
group by c.CategoryId;
这不会特别有效。但两者都不会打破这个串。你应该有一个关联表,每个项目(在原始表中)和类别一行。