SQL 中的 countif 类型函数,其中可以在其他列中检索总计数

countif type function in SQL where total count could be retrieved in other column

我在 table 中有 36 列,但其中一列有多次数据,如下所示

ID       Name       Ref
abcd    john doe    123
1234    martina     100
123x    brittany    123
ab12    joe         101

我想要

这样的结果
ID      Name        Ref cnt
abcd    john doe    123 2
1234    martina     100 1
123x    brittany    123 2
ab12    joe         101 1

因为 123 出现了两次,我希望它在 cnt 列中显示 2 等等

您应该提供 SQL 品牌了解功能:

1) 如果你的数据库支持 window functions:

Select
   *,
   count(*) over ( partition by ref ) as cnt 
from your_table

2) 如果不是:

Select
   T.*, G.cnt
from
  ( select * from your_table ) T inner join
  ( select count(*) as cnt from your_table group by ref ) G
  on T.ref = G.ref
select ID, Name, Ref, (select count(ID) from [table] where Ref = A.Ref)
from [table] A

编辑: 正如下面评论中提到的,这种方法可能不是在所有情况下都是最有效的,但在相当小的 tables 上应该足够了。

在我的测试中:

  • 5,460 条记录中的 table 和 976 个不同的 'Ref' 值在不到 1 秒内返回。
  • 600,831 条记录的 table 和 8,335 个不同的 'Ref' 值在 6 秒内返回。
  • 在 13 秒内返回了 table 的 845,218 条记录和 15,147 个不同的 'Ref' 值。

您可以在以下情况下将 COUNTOVER 一起使用:

查询

select ID, 
       Name, 
       ref,
       count(ref) over (partition by ref) cnt
from #t t

示例数据

create table #t
(
ID NVARCHAR(400),
Name NVARCHAR(400),
Ref INT
)

insert into #t values    
('abcd','john doe',    123),
('1234','martina',     100),
('123x','brittany',    123),
('ab12','joe',         101)