计算每行的出现次数并更新到新列

时间:2012-07-06 21:28:18

标签: sql-server tsql

我有这张桌子:enter image description here

我需要计算CloseTime列中同一行的出现次数,并在最后一列Count中写出出现次数,其中包含Item和同一帐户的where子句。

我对具体项目和帐户的单一选择是

SELECT CloseTime, COUNT(*) AS CloseTime
FROM Statement 
WHERE Account = 2013169 AND item = 'eurusd'
GROUP BY CloseTime
HAVING COUNT(*) > 1
ORDER BY COUNT(*) DESC

可以计入一个更新查询吗?

1 个答案:

答案 0 :(得分:1)

根据您的使用情况,这可能不是一个好主意。最好将“Count”创建为计算列,或将其完全从基表中删除,并创建包含count列的视图。此外,我通常会避免尝试使用名称也是保留字的列,例如Count。

但是,如果您真的想这样做,可以在一个查询中完成。为了确保我们在同一页面上,我相信你只是尝试按关闭时间进行分组,并且帐户和项目不会被包含在组中(因此,如果相同的关闭时间和不同的项目将被计算) ,但希望能够只更新目标帐户和项目。

在这种情况下,它看起来大致像

with cte1 as 
(select 
closetime, COUNT(*) as numCount
from dbo.[statement]
group by closetime)

update dbo.[statement]
set [count] = cte1.numCount
from  dbo.[statement] as sd
join cte1 
    on sd.closetime = cte1.closetime
where
    sd.account = <your account num>
    and sd.item = <your item>

编辑:

如果我从评论中理解你想要什么,那么你可以使用如下的查询:

with cte1 as 
(select 
closetime, COUNT(*) as numCount
from dbo.[statement]
group by closetime)

select sd.*, --I normally  would advise not using * in production
cte1.numCount as [Count]
from statement as sd
join cte1
   on sd.closetime = cte1.closetime
where
        sd.account = <your account num>
        and sd.item = <your item>

虽然这确实使用了CTE,但它是一个单独的SQL语句,它将按照关闭时间显示所选帐号num和item的计数。