Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用另一列中的多个值对一列中的不同记录进行计数_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 使用另一列中的多个值对一列中的不同记录进行计数

Sql 使用另一列中的多个值对一列中的不同记录进行计数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我很确定这是一个简单的问题,但我在措辞上有困难 我需要根据另一列中的不同条件计算一列中的值总数 例如: A CD B ABC C AD D A 将产生: A 3 B 1 C 2 D 2 计数时使用相关子查询。使用类似于查找行以查找要计数的行 select t1.col1, (select count(*) from tablename t2 where t2.col2 like '%' || t1.col1 ||'%') from tablen

我很确定这是一个简单的问题,但我在措辞上有困难

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

例如:

A CD

B ABC 

C AD

D A
将产生:

A 3

B 1

C 2

D 2

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

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

|
是ANSI SQL连接。有些产品使用
concat()
,或者
+
来代替它。

假设表名为yourtable,字段类似于soo

fielda fieldb
A      CD
B      ABC 
C      AD
D      A
代码


首先,您不应该将事物列表存储在字符串中

但是,有时人们会被这种格式所束缚。在您的示例中,似乎有一个包含所有可能值的表。如果是这样,您可以使用
连接

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

注意:这会计算包含该值的行,而不是。如果在一行中出现多个值,则查询会稍微复杂一些。

您可以使用与
类似的
相关子查询

样本数据

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

看起来您需要一个自连接,但技巧是在连接上使用模式匹配,而不是等连接

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;

以下是您如何做到这一点:

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

第二列的数据类型是什么?这是一个很棒的答案!这不会考虑<代码> AABC/<代码>两次。它将把
A
计算为1感谢您的回复。这是我需要的。@Chad,生产时要小心!请参阅我的评论。这不会考虑<代码> AABC/<代码>两次。它将
A
计算为1。@GiorgiNakeuri-是的,你是正确的,但是不确定这里是否需要这样做。我想你的答案对于一般情况来说是最准确的。
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