单列SQL上有多个计数

时间:2018-09-05 12:29:42

标签: sql sql-server count

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

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具有多个相同的Code之一。

问题是,我不需要所有这些输出(实际表要大得多)。我想让COUNT沿着“代码”列,并为每次代码迭代仅显示一行。如下所示:

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

在这方面的任何帮助都将非常有用,我希望我对问题的解释足够好。如果没有,请询​​问更多信息,如果在此之前已得到答复,请指向该方向。

谢谢。

6 个答案:

答案 0 :(得分: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 Fiddle

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

Results

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

答案 1 :(得分:2)

子查询

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

答案 2 :(得分:2)

我将使用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; 

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

;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

答案 5 :(得分:-1)

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

    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