我相信这是一个简单的问题,但我在措辞上遇到了困难。
我需要根据另一列中不同的条件来计算一列中值的总数。
例如:
A CD
B ABC
C AD
D A
将会产生:
A 3
B 1
C 2
D 2
我相信这是一个简单的问题,但我在措辞上遇到了困难。
我需要根据另一列中不同的条件来计算一列中值的总数。
例如:
A CD
B ABC
C AD
D A
将会产生:
A 3
B 1
C 2
D 2
首先,不应该将列表存储在一个字符串中。
但是,有时候某些情况下,会遇到这种格式。在你的例子中,你似乎有一个包含所有可能值的表格。如果是这样,你可以使用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;
AABC
计算两次,而是将 A
计为 1。 - Giorgi Nakeuri以下是步骤:
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
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
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计数时使用相关子查询。使用LIKE
查找要计数的行。
select t1.col1, (select count(*) from tablename t2
where t2.col2 like '%' || t1.col1 ||'%')
from tablename t1
||
是ANSI SQL中的串联符号。有些产品会使用concat()
或者+
代替。
看起来你需要进行自连接,但诀窍在于在连接上使用模式匹配而不是等值连接...
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;