在一个列中计算出现不同记录的次数,该列与另一列具有多个值。

4

我相信这是一个简单的问题,但我在措辞上遇到了困难。

我需要根据另一列中不同的条件来计算一列中值的总数。

例如:

A CD

B ABC 

C AD

D A

将会产生:

A 3

B 1

C 2

D 2

第二列的数据类型是什么? - Gordon Linoff
6个回答

5

首先,不应该将列表存储在一个字符串中。

但是,有时候某些情况下,会遇到这种格式。在你的例子中,你似乎有一个包含所有可能值的表格。如果是这样,你可以使用join方法:

select e.col1, count(e2.col2)
from example e left join
     example e2
     on charindex(e.col1, e2.col2) > 0
group by e.col1;

注意:这里计算的是包含该值的行数,如果单个行中出现多个值,则查询会更加复杂。

现在这个答案真棒! - Radu Gheorghiu
这将不会把 AABC 计算两次,而是将 A 计为 1。 - Giorgi Nakeuri
谢谢您的回复。这对我所需的功能很有效。 - Chad
1
@Chad,在生产中要小心!请看我的评论。 - Giorgi Nakeuri

5
这是如何实现的方法:

以下是步骤:

DECLARE @t TABLE ( c1 CHAR(1), c2 VARCHAR(5) )

INSERT  INTO @t
VALUES  ( 'A', 'CD' ),
        ( 'B', 'ABC' ),
        ( 'C', 'AD' ),
        ( 'D', 'A' )


SELECT  t.c1 ,
        SUM(count) AS count
FROM    @t t
        CROSS APPLY ( SELECT    LEN(c2) - LEN(REPLACE(c2, t.c1, '')) AS count
                      FROM      @t
                      WHERE     c2 LIKE '%' + t.c1 + '%'
                    ) ca
GROUP BY t.c1

3
我猜你的答案是适用于大多数情况的最准确的。 - Radu Gheorghiu

2
假设表名为yourtable,字段如下。
fielda fieldb
A      CD
B      ABC 
C      AD
D      A

代码

SELECT a.fielda, (SELECT COUNT(b.fieldb)
FROM yourtable b
WHERE b.fieldb LIKE '%a.fielda%' AND b.fielda = a.fielda) AS counter
FROM yourtable a

2
您可以使用带有LIKE的相关子查询。 示例数据
with cte(a,b) as 
(
select 'A','CD'
union all select 'B','ABC' 
union all select'C','AD'
union all select'D','A'
)

查询

select a,(select count(*) from cte c2 where b like '%' + c1.a +'%')
from cte c1
group by a

输出

A   3
B   1
C   2
D   2

这将不会将AABC计算两次,而是将A计为1。 - Giorgi Nakeuri
@GiorgiNakeuri - 是的,你是正确的,但不确定这里是否需要。 - ughai

1

计数时使用相关子查询。使用LIKE查找要计数的行。

select t1.col1, (select count(*) from tablename t2
                 where t2.col2 like '%' || t1.col1 ||'%')
from tablename t1

||是ANSI SQL中的串联符号。有些产品会使用concat()或者+代替。


1

看起来你需要进行自连接,但诀窍在于在连接上使用模式匹配而不是等值连接...

create table x1(c1 char(1) primary key, c2 varchar(5) not null); 

select x1.c1, count(*) 
  from x1 x1 
  join x1 x2 on x2.c2 like '%' || x1.c1 || '%' 
  group by x1.c1 
  order by 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接