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;
不需要子查询。
请参阅下面使用 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;
不需要子查询。