首页 > 解决方案 > 单列 SQL 的多次计数

问题描述

我目前正在运行如下查询:

SELECT a.ID, a.ContactID, a.Code, 
FROM tableA a
JOIN (SELECT ContactID, Code
      FROM tableA
      WHERE ContactID IS NOT NULL
      GROUP BY Code, ContactID
      HAVING COUNT(Code) > 1) b
ON (a.Code = b.Code AND a.ContactID = b.ContactID)
WHERE a.ContactID IS NOT NULL
ORDER BY a.Code

这将返回如下所示的数据:

table : a    
    +-------+-----------+-----------+
    |   ID  | ContactID |   Code    |     
    +-------+-----------+-----------+
    |   1   |    111    |  abcd2    |   
    |   2   |    111    |  abcd2    |   
    |   3   |    222    |  abcd1    |  
    |   4   |    222    |  abcd1    |   
    |   5   |    222    |  abcd1    |  
    |   6   |    222    |  abcd1    |
    +-------+-----------+-----------+

如您所见,我得到了具有多个相同代码的 ContactID。

问题在于,我不想要所有这些输出(实际表要大得多)。我希望 COUNT 与 Code 列并排,并且只为 Code 的每次迭代显示一行。如下所示:

 +-------+-----------+-----------+------+
 |   ID  | ContactID |   Code    |COUNT |    
 +-------+-----------+-----------+------+
 |   1   |    111    |  abcd2    |   2  | 
 |   3   |    222    |  abcd1    |   4  |
 +-------+-----------+-----------+------+

对此的任何帮助都会很棒,我希望我已经很好地解释了我的问题。如果没有,请询​​问更多信息,如果之前已回答,请指出该方向。

谢谢。

标签: sqlsql-servercount

解决方案


您的解决方案和其他答案很复杂,当您简单地聚合时,您不需要自我加入HAVING Count(x) > 1

SELECT MIN(ID), ContactID, Code, COUNT(Code) AS [COUNT]
FROM tableA
WHERE ContactID IS NOT NULL
GROUP BY Code, ContactID
HAVING COUNT(Code) > 1

完整解决方案:

SQL小提琴

CREATE TABLE TableA
    ([ID] int, [ContactID] int, [Code] varchar(5))
;

INSERT INTO TableA
    ([ID], [ContactID], [Code])
VALUES
    (1, 111, 'abcd2'),
    (2, 111, 'abcd2'),
    (3, 222, 'abcd1'),
    (4, 222, 'abcd1'),
    (5, 222, 'abcd1'),
    (6, 222, 'abcd1')
;

查询 1

SELECT min(id), ContactID, Code, count(Code) as [COUNT]
      FROM tableA
      WHERE ContactID IS NOT NULL
      GROUP BY Code, ContactID
      HAVING COUNT(Code) > 1

结果

|   | ContactID |  Code |   |
|---|-----------|-------|---|
| 1 |       111 | abcd2 | 2 |
| 3 |       222 | abcd1 | 4 |

推荐阅读