Sql server 如何添加一个新列,该列将计算特定列中重复值的数量

Sql server 如何添加一个新列,该列将计算特定列中重复值的数量,sql-server,Sql Server,我想添加一个新列,该列将计算特定列中重复值的数量,并在表的第一个出现行中显示计数结果。 例如,拥有下面的玩具桌: ID LOGIN NAME COUNTRY 11 a@com Aron USA 12 a@com Aron Israel 13 ff@com Lucci Germany 我想在表的第一个出现行中获取登录字段的计数: ID LOGIN NAME COUNTRY Count_LOGIN 11 a@com Aron USA 2 12 a@com Ar

我想添加一个新列,该列将计算特定列中重复值的数量,并在表的第一个出现行中显示计数结果。 例如,拥有下面的玩具桌:

ID LOGIN NAME   COUNTRY
11 a@com  Aron  USA
12 a@com  Aron  Israel
13 ff@com Lucci Germany
我想在表的第一个出现行中获取登录字段的计数:

ID LOGIN NAME   COUNTRY Count_LOGIN
11 a@com  Aron  USA         2
12 a@com  Aron  Israel      
13 ff@com Lucci Germany     1
我怎么做? 我知道我可以将表保存为临时表,然后执行下面所述的操作,但这并不完全是我需要的

SELECT LOGIN , COUNT(*) TotalCount
FROM #tt -- #tt is the first table 
GROUP BY LOGIN 
ORDER BY COUNT(*) DESC

首先,您可以使用
altertable
添加新列
Count\u LOGIN
。然后,使用带有子查询的
UPDATE
语句填充该列。你问题中的查询看起来正好是你想要的

ALTER TABLE #tt
ADD Count_LOGIN int;

UPDATE #tt
SET Count_LOGIN =
(
    SELECT COUNT(*)
    FROM #tt b
    WHERE #tt.LOGIN = b.LOGIN
    GROUP BY LOGIN
)
更新:

id  loginn  name    cntry   duplicate
11  a@com   Aron    USA         2
12  a@com   Aron    Israel      0
13  ff@com  Lucci   Germany     1
假设您只想更新具有最小
ID
值的每个
LOGIN
组的记录,您可以尝试以下join
update
查询:

UPDATE #tt
SET #tt.Count_LOGIN = t.TotalCount
FROM #tt
INNER JOIN
(
    SELECT LOGIN, MIN(ID) AS ID, COUNT(*) AS TotalCount
    FROM #tt
    GROUP BY LOGIN
) t
    ON #tt.ID = t.ID AND #tt.LOGIN = t.LOGIN
此查询只会影响原始
#tt
表中与每个
登录
组的最小
ID
值匹配的记录。这将使该组中的其他记录没有值

create table #temp
(
id int,
loginn varchar(10),
name varchar(10),
cntry varchar(40)
)

insert into #temp
select 
11, 'a@com',  'Aron', 'USA'     union all
select 12, 'a@com',  'Aron',  'Israel'  union all
select 13, 'ff@com', 'Lucci', 'Germany'


;with cte
as
(
select *,ROW_NUMBER() over (partition by loginn order by id) as rn
 from #temp
 )
 select 
 id,loginn,name,cntry,
 case 
 when rn=1 then (select count(*) from cte  t1 where t1.loginn=t2.loginn) 
 else 0 
 end as duplicate
 from
cte t2
输出:

id  loginn  name    cntry   duplicate
11  a@com   Aron    USA         2
12  a@com   Aron    Israel      0
13  ff@com  Lucci   Germany     1

您可以尝试使用窗口函数获取计数并决定何时显示结果

SELECT
    Id
  , Login
  , Name
  , Country
  , COUNT(*) OVER (PARTITION BY Login) as Cnt
  , CASE WHEN 1 = ROW_NUMBER() OVER (PARTITION BY Login ORDER BY Id) -- (Order by need to match query Order statement)
         THEN COUNT(*) OVER (PARTITION BY Login) as Cnt
         ELSE NULL
    END AS Cnt_ONLY_ON_FIRST_RECORD
FROM #tt
ORDER BY 
    ID -- (Order by need to match Order in CASE condition statement)

问:为什么Israel没有一个登录名的值?这是因为登录名字段很重要,我希望看到每个登录名的行数,并且只在第一行显示该值。可能要添加和TotalCount>=1,根据上面的示例,当count为0时,似乎不应进行更新。感谢@Tim Biegeleisen,我收到一个无效列名“count\u LOGIN”的错误@MQL4初学者对于语法错误,我已更新了我的答案。感谢@Tim Biegeleisen,非常好的解决方案。有没有办法只让第一行显示输出表示例中的重复数?@mql4初学者我再次更新,这次使用了一个连接查询,我相信它可以给出您想要的确切结果。