SQL-基于匹配列和值范围计算行数
请参阅下面使用带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位于同一行的实例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
提前感谢您的关注。我怀疑您想要:
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之后添加任何内容。