T-SQL计数不同,按不同的ID分组

时间:2018-01-24 08:53:34

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

我有以下类型的表:

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

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

基本上我试图做到这一点:

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

FROM

(SELECT T.BranchName, T.CustID

FROM MyTable T) as X

GROUP BY X.BranchName

我试过这段代码:

Promise hell

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

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

一个答案给你。正如我在评论中所说的那样,理想情况下,您希望为分支设置一个单独的表,否则,在过滤结果时,您不能执行0 9的计数,这将不返回任何行,并被省略)。这就是为什么第二个CTE可以获得DISTINCT的{​​{1}}值。

BranchName