在另一列上分组的两列不同

Kas*_*NVL 13 sql t-sql sql-server

我试图在SQL Server中的另一列上分组的两列上获取重复值的数量.

以下是我正在研究的示例场景.

    DECLARE @mytable TABLE (CampName varchar(10),ID VARCHAR(10),ListName varchar(10))
    INSERT INTO @mytable
            ( CampName, ID, ListName )
    VALUES  ( 'A',   'X',   'Y' ), ( 'A',   'X',   'Y' ), 
            ( 'A',   'Y',   'Z' ), ( 'A',   'Y',   'Z' ),
            ( 'A',   'Y',   'Z' ), ( 'A',   'P',   'Q' ),
            ( 'B',   'X',   'Y' ), ( 'B',   'X',   'Y' ), 
            ( 'B',   'Y',   'Z' ), ( 'B',   'Y',   'Z' ),
            ( 'B',   'Y',   'Z' ), ( 'B',   'P',   'Q' ),
            ( 'B',   'R',   'S' ), ( 'B',   'R',   'S' )
Run Code Online (Sandbox Code Playgroud)

这将产生下表.

 CampName   ID  ListName
-------------------------------------
      A     X     Y
      A     X     Y -- Duplicate Record
      A     Y     Z
      A     Y     Z -- Duplicate Record
      A     Y     Z -- Duplicate Record
      A     P     Q
      B     X     Y 
      B     X     Y -- Duplicate Record
      B     Y     Z
      B     Y     Z -- Duplicate Record
      B     Y     Z -- Duplicate Record
      B     P     Q
      B     R     S
      B     R     S -- Duplicate Record
Run Code Online (Sandbox Code Playgroud)

我需要输出如下:

CampName   dupcount
-------------------
A            3
B            4
Run Code Online (Sandbox Code Playgroud)

基本上,我需要计算每个CampName的重复数(ID,ListName),而不管重复值是什么.

如果我能澄清这方面的其他内容,请告诉我.任何帮助将不胜感激.

Gio*_*sos 9

您可以使用以下查询:

SELECT CampName, SUM(cnt) AS dupcount
FROM (
  SELECT CampName, COUNT(*) - 1 AS cnt
  FROM @mytable
  GROUP BY CampName, ID, ListName
  HAVING COUNT(*) > 1) AS t
GROUP BY CampName
Run Code Online (Sandbox Code Playgroud)

内部查询使用HAVING子句过滤掉非重复条目.它还计算每个重复记录的数量ID, ListName.外部查询只是对重复项的数量求和.


Gor*_*off 5

这是获得所需结果的简单方法:

select t.campname, count(*) - count(distinct t.listname) as num_duplicates
from @mytable t
group by t.campname;
Run Code Online (Sandbox Code Playgroud)

逻辑是count(*)计算所有行. count(distinct)计算不同列表的数量.差异是重复的数量.

编辑:

Giorgios提出了一个很好的观点.但是,数据看起来像idname包含相同的信息,因此似乎只需要一个.如果必须同时使用两者,许多数据库都可以让您:

select t.campname, count(*) - count(distinct t.id, t.listname) as num_duplicates
from @mytable t
group by t.campname;
Run Code Online (Sandbox Code Playgroud)

但不是SQL Server.相反,将它们连接在一起:

select t.campname,
       count(*) - count(distinct concat(t.id, ':', t.listname)) as num_duplicates
from @mytable t
group by t.campname;
Run Code Online (Sandbox Code Playgroud)

  • 我认为`distinct`应该考虑*两个*字段,而不仅仅是`listname`. (2认同)

Tim*_*sen 5

我相信每组的总数不同ID , ListName需要从中减去组合的数量,CampName以获得正确的结果.

SELECT t.CampName,
       COUNT(*) - COUNT(DISTINCT 'ColOne' + ID + 'ColTwo' + ListName) AS dupcount
FROM yourTable t
GROUP BY CampName
Run Code Online (Sandbox Code Playgroud)

此查询使用一个技巧,即连接IDListName列(均为文本),以有效地形成伪组.对此的需求是DISTINCT仅适用于单个列,但您需要考虑两个列.

参考: Quora:在SQL中,如何在多列上计算DISTINCT?