【问题标题】:T-SQL count distinct and group by distinct IDsT-SQL 计数不同并按不同 ID 分组
【发布时间】:2018-07-03 06:04:00
【问题描述】:

我有以下类型的表:

BranchName CustID
========== ======
Branch1    1111
Branch1    1111
Branch1    2222
Branch2    2222
Branch2    4444 
Branch3    1111
Branch4    3333

我想要实现的是计算不同的 CustID 并按分支对它们进行分组,而不重复任何 CustID。

基本上我正在尝试解决这个问题:

BranchName DistCountofCust
========== ======
Branch1    2
Branch2    1
Branch3    0
Branch4    1

我试过这段代码:

SELECT X.BranchName, COUNT(DISTINCT X.CustID) as DistCountofCust

FROM

(SELECT T.BranchName, T.CustID

FROM MyTable T) as X

GROUP BY X.BranchName

它没有给出正确的结果(没有正确计算每个分支的 CustID 数量,因为某些分支的 CustID 重叠)。是否可以消除不同的 CustID 并将它们按给定的分支进行分组? (在最终结果中,我只需要为分支机构列出唯一客户)。

【问题讨论】:

  • 您期望什么结果集?如果它不能正常工作,我们需要知道你所说的是正确的。 :)
  • 它可以简化为SELECT X.BranchName, COUNT(DISTINCT X.CustID) as DistCountofCust FROM MyTable as X GROUP BY X.BranchName 但是代码对我来说似乎是正确的
  • @Larnu 我已经编辑了这个问题。我认为我没有正确说明我想要实现的目标。

标签: sql-server group-by count distinct-values


【解决方案1】:

给你一个答案。正如我在评论中所说,理想情况下,您希望为您的分支创建一个单独的表,否则,在过滤结果时,您无法计数 0 9,因为这将不返回任何行,并被省略)。这就是为什么有第二个 CTE 来获取 BranchNameDISTINCT 值。

CREATE TABLE #Branch (BranchName varchar(10), CustID int);

INSERT INTO #Branch
VALUES
('Branch1',1111),
('Branch1',1111),
('Branch1',2222),
('Branch2',2222),
('Branch2',4444), 
('Branch3',1111),
('Branch4',3333);

WITH FirstCustomer AS(
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY CustID ORDER BY BranchName) AS RN
    FROM #Branch),
Branches AS ( --really you should have a seperate table to store your branches in
    SELECT DISTINCT BranchName
    FROM #Branch)
SELECT B.BranchName,
       COUNT(FC.CustID) AS Customers
FROM Branches B
     LEFT JOIN FirstCustomer FC ON B.BranchName = FC.BranchName
                               AND FC.RN = 1
GROUP BY B.BranchName;

DROP TABLE #Branch;

【讨论】:

    【解决方案2】:

    您可以为此使用NOT EXISTS。我假设分支根据其名称具有一定的优先级。

    SELECT T1.BranchName, COUNT(DISTINCT X.CustID) as DistCountofCust
    FROM MyTable T1
    LEFT JOIN (
       SELECT BranchName, CustID
       FROM MyTable T1
       WHERE NOT EXISTS (
          SELECT 1
          FROM MyTable T2
          WHERE T1.BranchName > T2.BranchName and
                T1.CustID = T2.CustID
       )
    ) as X ON T1.BranchName = X.BranchName and T1.CustID = X.CustID
    GROUP BY T1.BranchName
    

    dbfiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多