使用另一列中的多个值计算一列中的不同记录

时间:2015-05-14 11:48:11

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

我很确定这是一个简单的问题,但我在措辞方面遇到了麻烦。

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

示例:

A CD

B ABC 

C AD

D A

会屈服:

A 3

B 1

C 2

D 2

6 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分: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

答案 2 :(得分:2)

假设表名为yourtable,字段就像soo。

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

答案 3 :(得分:2)

您可以将相关子查询与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

<强>输出

      <select class="form-control"  
                    data-ng-model="concept.type" 
                    data-ng-options="t for t in myTypes" 
                    required>
               <option value="">-- Choose a type --</option>
      </select>

答案 4 :(得分:1)

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

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

||是ANSI SQL串联。有些产品使用concat()+代替。

答案 5 :(得分:1)

看起来你需要一个自我加入,但诀窍是在连接上使用模式匹配而不是equi-join ......

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;