首页 > 解决方案 > 查找具有相同值的 ID 的计数

问题描述

我想计算与其他 ID 具有相同值(Drops)的所有 ID。例如,下图显示 ID 1 和 3 有 A 掉落,因此查询会计算它们。同样,ID 7 和 18 有 B 下降,因此查询将计算另外两个 ID,总计 4 个 ID 共享相同的值,这就是我的查询将返回的内容。

+------+-------+
| ID   | Drops |
+------+-------+
|  1   |   A   |
|  2   |   C   |
|  3   |   A   |
|  7   |   B   |
| 18   |   B   |
+------+-------+

我尝试了几种方法,但以下查询是我最后一次尝试。

With cte1 (Id1, D1) as 
(
    select Id, Drops
    from Posts
),
cte2 (Id2, D2) as 
(
    select Id, Drops
    from Posts
) 
Select count(distinct c1.Id1) newcnt, c1.D1 
from cte1 c1
left outer join cte2 c2 on c1.D1 = c2.D2
group by c1.D1 

如果全部写出,结果将是单值输出,但查询应选择的记录应如下所示:

    +------+-------+
    | ID   | Drops |
    +------+-------+
    |  1   |   A   |
    |  3   |   A   |
    |  7   |   B   |
    | 18   |   B   |
    +------+-------+

任何建议都会很棒。谢谢

标签: sqlsql-server

解决方案


您可以使用 aCTE生成Drops具有多个对应ID值的值列表,然后JOIN查找具有多个 Post 值Posts的所有行:Drops

WITH CTE AS (
  SELECT Drops
  FROM Posts
  GROUP BY Drops
  HAVING COUNT(*) > 1
)
SELECT P.*
FROM Posts P
JOIN CTE ON P.Drops = CTE.Drops

输出:

ID  Drops
1   A
3   A
7   B
18  B

如果需要,您可以计算这些帖子的总数(或按Drops价值分组):

WITH CTE AS (
  SELECT Drops
  FROM Posts
  GROUP BY Drops
  HAVING COUNT(*) > 1
)
SELECT COUNT(*) AS newcnt
FROM Posts P
JOIN CTE ON P.Drops = CTE.Drops

输出

newcnt
4

SQLFiddle 上的演示


推荐阅读