SQL,在列S中查找映射到B列中相同值的值

时间:2015-06-09 15:38:21

标签: sql sql-server-2008-r2

我有一个包含多个列的表。相关列是S和B.

S  |  B
-------
s1 | b1
s2 | b1
s3 | b2
s4 | b3
s5 | b4
s6 | b4
s7 | b5
s7 | b6
s7 | b7
s8 | b7

我想获得映射到相同B值的所有S值的列表,然后计算唯一的B值:因此上表中的结果将如下所示,并且唯一B值的计数将是3(b1,b4和b7)

S  |  B
-------
s1 | b1
s2 | b1
s5 | b4
s6 | b4
s7 | b7
s8 | b7

为了通过列出重复的B值来解决问题,我遇到了有助于查找重复项的查询,但这并不是我需要的。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

首先,我将生成一组数据,每个数据具有每个S的不同计数,然后再连接回源表中的基本数据集,并按计数限制> 1从内联视图。

SELECT Z.S, Z.B 
FROM Table Z
INNER JOIN (
  SELECT count(Distinct S) cnt, B 
  FROM table 
  GROUP BY B)  Y
 on Z.B = Y.B
Where Y.cnt > 1

答案 1 :(得分:0)

假设使用SQL-Server,您可以使用Over-clause

使用以下查询
WITH CTE AS
(
  SELECT S, B, COUNT(*)OVER(PARTITION BY B) AS CntB
  FROM TableName
)
SELECT S, B
FROM CTE 
WHERE CntB > 1
;

WITH CTE AS
(
  SELECT S, B, COUNT(*)OVER(PARTITION BY B) AS CntB
  FROM TableName
)
SELECT CntUniqueB = (SELECT COUNT(DISTINCT B)
                     FROM CTE
                     WHERE CntB > 1)

DEMO