2015-05-14 75 views
4

我很確定這是一個簡單的問題,但我無法對其進行表述。用另一列中的多個值計算一列中的不同記錄

我需要根據另一列中的不同條件計算一列中值的總數。

實施例:

A CD 

B ABC 

C AD 

D A 

將產生:

A 3 

B 1 

C 2 

D 2 
+0

第二列的數據類型是什麼? –

+0

兩者都是varchar。 – Chad

回答

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; 

注:此計算包含的值,而行。如果單個行中出現多個值,則查詢會更復雜一些。

+0

現在這是一個很棒的答案! –

+0

這不會考慮'AABC'兩次。它會將'A'計爲1 –

+0

謝謝您的回覆。這適用於我所需要的。 – Chad

1

計數時,使用一個相關子查詢。使用LIKE查找行以查找要計數的行。

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

||是ANSI SQL連接。有些產品使用concat()+

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 
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 
+0

這不會考慮'AABC'兩次。它會將「A」計爲1. –

+0

@GiorgiNakeuri - 是的,你是正確的,但不知道這是否需要。 – ughai

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; 
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

我想你的答案是一般情況下最準確的答案。 –

相關問題