【问题标题】:SQL - Count rows based on matching columns and value rangeSQL - 根据匹配列和值范围计算行数
【发布时间】:2021-03-26 01:57:45
【问题描述】:

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

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

总列是一个介于 80 到 100 之间的 INT 值。
表 L 的列:Bname 和 Gname 将包含来自同一行的 B 和 G 表的名称。如果两个名称都在同一行上,我想将其计为一个项目;仅当表 G 上的 Gross 与相应的 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;

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

提前感谢您的关注。

【问题讨论】:

  • 为什么要在子查询和FROM 中执行横向连接?如果您使用该子查询,则不需要 FROM l 之后的任何内容。

标签: sql sql-server group-by count subquery


【解决方案1】:

我怀疑你想要:

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;

不需要子查询。

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2017-05-16
    • 2018-07-05
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多