0

我有一个包含以下示例数据的表:

**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 子句。

请建议

4

3 回答 3

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
于 2013-08-24T09:31:59.710 回答
0

如果您正在寻找下面的输出

Category    Reg Count
277         12
274         12
47          1
276         13
278         13
275         13

SQL 小提琴演示

尝试这个

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
于 2013-08-24T07:58:06.437 回答
0

如果您有“类别”表,则可以使用以下查询执行此操作:

select c.CategoryId, count(*)
from t join
     categories c
     on ','+cast(c.CategoryId as varchar(255))+',' like '%,'+CategoriesId+',%'
group by c.CategoryId;

这不会特别有效。但两者都不会把绳子分开。您确实应该有一个关联表,其中每个项目(在您的原始表中)和类别中有一行。

于 2013-08-24T12:07:48.563 回答