包含 where 子句和总计表值出现次数的 SQL 返回表

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。

我尝试查看计算列,但据我所知它不支持这种类型的查询。

有人能指出我正确的方向吗?

Cha*_*ace 9

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)

数据库<>小提琴


Pau*_*ite 6

另外三种选择:

子查询

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)

db<>fiddle在线演示