对单个列 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 与代码列并排,并且只为代码的每次迭代显示一行。如下所示:

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

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

谢谢。

您的解决方案和其他答案很复杂,当您简单地聚合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 |

我会使用exists而不是子查询:

select min(a.id) as id, a.ContactID, a.Code, count(*) as Cnt
from tableA a
where exists (select 1 
from tableA a1 
where a1.ContactID = a.ContactID and 
a1.Code = a.Code and 
a1.id <> a.id
)
group by a.ContactID, a.Code; 

子查询

select min(ID) as id, ContactID,Code,count(*) as cnt from 
(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.RetailContactID IS NOT NULL
ORDER BY a.Code
) t group ContactID,Code
;WITH CTE AS 
(
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.RetailContactID IS NOT NULL
)
SELECT ID, ContactID, Code, COUNT(*) AS Cnt
FROM CTE 
GROUP BY ID, ContactID, Code
ORDER BY 1, 2, 3

使用另一个分组扩展 SQL 查询:

SELECT min(a.ID), a.ContactID, a.Code, count(*)
...
GROUP BY a.ContactID, a.Code
ORDER BY a.Code

在选择查询中使用分组依据

select x.ContactID, x.Code, [count] = count(x.id) from (
select id = 1   ,    ContactID  = 111   , Code = 'abcd2'    union all    
select 2   ,    111   , 'abcd2'    union all    
select 3   ,    222   , 'abcd1'    union all   
select 4   ,    222   , 'abcd1'    union all    
select 5   ,    222   , 'abcd1'    union all   
select 6   ,    222   , 'abcd1') x  group by x.Code, x.ContactID

最新更新