2

我有这样的数据:

我表中的发明者列

Hundley; Edward; Ana
Isler; Hunsberger
Hunsberger;Hundley

名称用 ; 分隔。我想编写一个汇总计数的 SQL 查询。

例如。结果应该是:

Hundley     2
Isler       1
Hunsberger  2
Edward      1
Ana         1

我可以做一个分组,但这不是一个简单的分组,如你所见。关于如何获得此输出的任何想法/想法?

编辑:更改了结果,因此不会造成任何混淆,即一行仅包含 2 个名称。

4

5 回答 5

1

你可以看看这个。如果您有大量数据,我当然不推荐这种方式,但是您可以进行一些修改并使用它,它就像一个魅力!

这是支持无限拆分的新代码:

Declare @Table  Table   (
    Name    Nvarchar(50)
);

Insert  @Table  (
    Name
)   Select  'Hundley; Edward; Anna'
Union   Select  'Isler; Hunsberger'
Union   Select  'Hunsberger; Hundley'
Union   Select  'Anna'
;

With    Result  (
    Part
,   Remained
,   [Index]
,   Level
)   As  (
    Select  Case    When    CharIndex(';', Name, 1) =   0
            Then    Name
            Else    Left(Name, CharIndex(';', Name, 1) - 1)
        End
    ,   Right(Name, Len(Name) - CharIndex(';', Name, 1))
    ,   CharIndex(';', Name, 1)
    ,   1
        From    @Table
Union   All
    Select  LTrim(
        Case    When    CharIndex(';', Remained, 1) =   0
            Then    Remained
            Else    Left(Remained, CharIndex(';', Remained, 1) - 1)
        End
    )
    ,   Right(Remained, Len(Remained) - CharIndex(';', Remained, 1))
    ,   CharIndex(';', Remained, 1)
    ,   Level
    +   1
        From    Result
        Where   [Index] <>  0
)   Select  Part
    ,   Count(*)
        From    Result
        Group   By  Part

干杯

于 2012-09-08T06:02:51.207 回答
1
;with cte as  
( 
    select 1 as Item, 1 as Start, CHARINDEX(';',inventors, 1) as Split, Inventors from YourInventorsTable
    union all 
    select cte.Item+1, cte.Split+1, nullif(CHARINDEX(';',inventors, cte.Split+1),0), inventors as Split 
    from cte 
    where cte.Split<>0   
)    

select rTRIM(lTRIM(SUBSTRING(inventors, start,isnull(split,len(inventors)+1)-start))), count(*)
from cte  
group by rTRIM(lTRIM(SUBSTRING(inventors, start,isnull(split,len(inventors)+1)-start)))
于 2012-09-08T06:57:03.770 回答
1

您可以创建一个拆分函数来拆分列值

select splittedValues.items,count(splittedValues) from table1
cross apply dbo.split(col1,';') splittedValues
group by splittedValues.items

Sql fiddle 中的 DEMO

于 2012-09-08T21:56:39.337 回答
0

首先创建一个函数,将逗号或任何其他运算符(;)分隔的字符串放入一个表中,并使用该临时表,在该表上应用 GROUP 函数。

因此,您将获得单独价值的计数。

"select d.number,count(*) from (select number from dbo.CommaseparedListToTable('Hundley;Edward;Ana;Isler;Hunsberger;Hunsberger;Hundley',';'))d group by d.number"

于 2013-12-06T10:57:33.207 回答
0
  
    声明@text nvarchar(255) = '爱德华; 亨德利;分析员;亨斯伯格; 亨斯伯格; 亨德利';
    声明@table table(id int identity,name varchar(50));

    而@text like '%;%'
    开始
    插入@table(名称)
    选择 SUBSTRING(@text,1,charindex(';',@text)-1)
    设置@text = SUBSTRING(@text, charindex(';',@text)+1,LEN(@text))
    结尾
    插入@table(名称)
    选择@文本
    select name , count(name) 从 @table group 按名称计数

输出

名字      计数 
分析员 1
亨德利 2
亨斯伯格 2
爱德华一世
于 2015-03-26T11:03:42.990 回答