Eye*_*arp 5 sql-server count where
我很难弄清楚如何实现这一目标。我知道如何用 C# 实现它,但不知道如何用 SQL 实现。
假设我有下表:
ID | 姓名 | 路由ID |
---|---|---|
1 | 鲍勃 | 1001 |
2 | 鲍勃 | 1002 |
3 | 安娜 | 1001 |
4 | 吉姆 | 1001 |
5 | 伊莱 | 1001 |
我想返回整个表,并用一个额外的列显示routeID
按名称出现的总次数,所以where name='Bob'
看起来像:
ID | 姓名 | 路由ID | 全部的 |
---|---|---|---|
1 | 鲍勃 | 1001 | 4 |
2 | 鲍勃 | 1002 | 1 |
但是,如果我写类似的东西
declare @ct as nvarchar(5)
set @ct = (SELECT COUNT(RouteId) from <table>)
select *, @ct
from <table>
where name = 'Bob'
Run Code Online (Sandbox Code Playgroud)
我得到所有路线 ID 的总数,而不仅仅是行中显示的路线 ID。
我尝试查看计算列,但据我所知它不支持这种类型的查询。
有人能指出我正确的方向吗?
COUNT
您可以在派生表(子查询)中使用窗口
SELECT *
FROM (
SELECT *,
Total = COUNT(*) OVER (PARTITION BY t.RouteId)
FROM MyTable t
) t
WHERE t.Name = 'Bob';
Run Code Online (Sandbox Code Playgroud)
另外三种选择:
SELECT
MT.*,
Total =
(
SELECT COUNT_BIG(*)
FROM dbo.MyTable AS MT2
WHERE
MT2.RouteId = MT.RouteId
)
FROM dbo.MyTable AS MT
WHERE
MT.[Name] = 'Bob';
Run Code Online (Sandbox Code Playgroud)
SELECT
MT.*,
A.Total
FROM dbo.MyTable AS MT
CROSS APPLY
(
SELECT Total = COUNT_BIG(*)
FROM dbo.MyTable AS MT2
WHERE MT2.RouteId = MT.RouteID
GROUP BY ()
) AS A
WHERE
MT.[Name] = 'Bob';
Run Code Online (Sandbox Code Playgroud)
SELECT
MT.*,
T.Total
FROM dbo.MyTable AS MT
JOIN
(
SELECT
MT2.RouteId,
Total = COUNT_BIG(*)
FROM dbo.MyTable AS MT2
GROUP BY MT2.RouteId
) AS T
ON T.RouteId = MT.RouteId
WHERE
MT.[Name] = 'Bob';
Run Code Online (Sandbox Code Playgroud)