SQL - 根据匹配的列和值范围计算行数

SQL - Count rows based on matching columns and value range

请参阅下面使用 T-SQL 和 SSMS 的查询。一共有三个表:B、G、L。

B 有列 Bname
G 有 2 列 Gname,Gross
L 有 2 列 Bname, Gname

Gross 列是一个介于 80 和 100 之间的 INT 值。
Table L 的列:Bname 和 Gname 将在同一行中显示 B 和 G 表中的名称。如果两个名字都在同一行,我想把它算作一个项目;仅当 Table G 的总值在对应的 Gname 行的 80 到 100 之间时。
我当前的查询是:

SELECT l.bname, (SELECT COUNT(*) FROM g WHERE g.gross BETWEEN 80 AND 90) AS Good  
FROM l  
INNER JOIN b  
ON b.bname=l.bname  
INNER JOIN g  
ON g.gname=l.gname  
GROUP BY l.bname;

结果差不多了,但是它计算了 80 到 100 之间的所有 Table G:Gname 行。在 Table L 上发出实例,其中 Bname 和 Gname 在同一个行。

在此先感谢您的关注。

我怀疑你想要:

SELECT l.bname,
       (SELECT COUNT(*)
        FROM b INNER JOIN
             g  
             ON g.gname = l.gname 
        WHERE b.bname = l.bname AND g.gross BETWEEN 80 AND 90
       ) AS Good  
FROM l ;

不需要外部聚合 l.bname 是唯一的。

这更常见的是使用条件聚合进行计算:

SELECT l.bname, 
       SUM(CASE WHEN g.gross BETWEEN 80 AND 90 THEN 1 ELSE 0 END) AS Good  
FROM l INNER JOIN
     b  
     ON b.bname = l.bname INNER JOIN
     g  
     ON g.gname = l.gname  
GROUP BY l.bname;

不需要子查询。