按csv列SQL对行进行分组

时间:2013-08-24 07:29:10

标签: sql sql-server sql-server-2008 tsql

我有一张包含以下样本数据的表格:

**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子句的这种情况。

请建议

3 个答案:

答案 0 :(得分:0)

如果您正在寻找

以下的输出
Category    Reg Count
277         12
274         12
47          1
276         13
278         13
275         13

SQL FIDDLE DEMO

试试这个

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;

这不会特别有效。但两者都不会打破这个串。你应该有一个关联表,每个项目(在原始表中)和类别一行。