繁体   English   中英

单列SQL上的多个计数

[英]Multiple counts on a single column 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  |
 +-------+-----------+-----------+------+

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

谢谢。

您的解决方案和其他答案是复杂的,当您只是聚合HAVING Count(x) > 1时,您不需要自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 |

子查询

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

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

通过一个分组扩展SQL查询:

SELECT min(a.ID), a.ContactID, a.Code, count(*)
...
GROUP BY a.ContactID, a.Code
ORDER BY a.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

在您的选择查询中使用group by

    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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM