【问题标题】:SQL: Counting the number of rows while accounting for duplicatesSQL:计算行数同时考虑重复项
【发布时间】:2014-07-31 06:36:45
【问题描述】:

我有一个相当简单的问题,但我无法解决。我有两个表,一个帐户表和一个客户表。帐户表中的每一行都是唯一的,但有多个客户可以与一个帐户 ID 相关联。例如,帐户 id 101 与客户表中的 id 1 和 2 相关联。

我想要做的是连接这两个表,以便我可以计算给定日期期间帐户表中的行数。但是,我也想只选择客户表中 cust 值为 A 的那些帐户。所以我需要加入这两个表,并且我正在努力结合连接和不同的方面。

Acct table = 
account    ...
101          ...
102          ...
103          ...
104          ...
105          ...

Customer table = 
id          prim_acct     cust
1               101           A
1               101           A
2               102           A    
3               103           A    
3               103           A
3               103           A
4               104           R
5               105           R

我尝试过的一些不连贯的事情。由于数据量很大,我只是尝试与前 10 名一起工作,并计算可以将每个帐户隔离为 1 个的计数。

;with CTE as
( 
  SELECT TOP 10 * FROM dbo.CL_CUSTOMER AS cus
  WHERE cus.CUSTOMER_STATUS = 'A'
) 
SELECT ac.ACCOUNT_NUMBER, COUNT(*) AS ac
GROUP BY ac.ACCOUNT_NUMBER FROM CTE;


SELECT TOP 10 cus.PRIMARY_ACCOUNT_NUMBER, COUNT(*) FROM dbo.CL_ACCOUNT AS ac 
INNER JOIN (SELECT DISTINCT ACCOUNT_NUMBER FROM dbo.CL_CUSTOMER WHERE CUSTOMER_STATUS = 'A') 
                dbo.CL_CUSTOMER AS cus ON ac.ACCOUNT_NUMBER = cus.PRIMARY_ACCOUNT_NUMBER
GROUP BY cus.PRIMARY_ACCOUNT_NUMBER
HAVING COUNT(*) >= 2;

【问题讨论】:

  • 只是一个提示,但是对于您想要查询的大表,将一些数据抽取到一个更小、更快的表中并针对它进行测试。 FWIW。

标签: sql sql-server


【解决方案1】:

我认为您正在尝试这样做:

select count(distinct a.account)
from account a join
     customer c
     on a.account = c.prim_acct
where c.cust_value = 'A' and
      a.thedate between @date1 and @date2;

您也可以将其表述为exists 查询。这样你就不需要count(distinct):

select count(a.account)
from account a 
where exists (select 1
              from customer c
              where a.account = c.prim_acct and c.cust_value = 'A'
             ) and
      a.thedate between @date1 and @date2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2016-07-09
    • 2021-06-15
    • 2016-12-04
    相关资源
    最近更新 更多