SQL-基于匹配列和值范围计算行数

SQL-基于匹配列和值范围计算行数,sql,sql-server,group-by,count,subquery,Sql,Sql Server,Group By,Count,Subquery,请参阅下面使用带SSMS的T-SQL查询。有三张桌子:B、G和L B有一个列Bname G有两列Gname,Gross L有两列Bname,Gname Gross列是介于80和100之间的整数。 表L的列:Bname和Gname将以同一行上的B和G表中的名称为特征。如果两个名字都在同一行,我想把它算作一个项目;仅当表G中对应Gname行的总值介于80和100之间时。 我当前的查询是: 选择l.B名称,从g中选择COUNT*,其中g.gross在80到90之间为良好 从l 内连接b 在b.bnam

请参阅下面使用带SSMS的T-SQL查询。有三张桌子:B、G和L

B有一个列Bname G有两列Gname,Gross L有两列Bname,Gname

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

选择l.B名称,从g中选择COUNT*,其中g.gross在80到90之间为良好 从l 内连接b 在b.bname=l.bname上 内连接g 关于g.gname=l.gname 按l.bname分组; 结果差不多是这样,但它统计了80到100之间的所有表G:Gname行。发出表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;

不需要子查询。

为什么要在子查询中执行横向联接,而在FROM中执行横向联接?如果使用该子查询,则不需要在FROM l之后添加任何内容。