使用 where 子句上的每个子查询在 SQL 服务器中计数

Using every subqueries on where clause to count in SQL Server

我有 table TableLL 存储经度和纬度,前 10 行如下所示:

Latitude    Longitude   ID
---------------------------
52.239215   -0.927128   1
52.627201   -1.701828   2
53.413624   -2.151294   3
52.402537   -1.519893   4
52.991135   -2.411111   5
53.409981   -2.598566   6
52.596913   -2.090278   7
52.041275   -0.777819   8
53.196655   -2.909875   9
52.945638   -1.13321    10

并且我可以通过使用此查询计算来自 tableLL 的一个纬度和一个经度的不同 table (MainTable) 中的行数:

SELECT 
    Month, Crime_type, count(*) as TOTAL
FROM 
    MainTable
WHERE 
    ABS(MainTableLongitude - (SELECT Longitude
                              FROM TableLL
                              WHERE ID = 1)) < 0.014347 
    AND ABS(MainTableLongitude - (SELECT Latitude 
                                  FROM TableLL
                                  WHERE ID = 1)) < 0.023033
GROUP BY 
    Crime_type,MONTH

结果是:

Month      Crime_type   TOTAL
-----------------------------
2015-04     ASB         326
2015-04     Burglary     44
2015-04     CDA          50
2015-05     ASB         126
2015-05     Burglary     21
2015-05     CDA           3
2015-06     ASB          14
2015-06     Burglary      7
2015-06     CDA          58

但我想通过使用 TableLL 中的所有纬度和经度来计算结果(我必须将 TableLL 中的每一行与 MainTable 中的值进行比较 WHERE 子句)。有什么想法吗?

是这样的吗?

SELECT Month,Crime_type,count(*) as TOTAL
FROM MainTable, TableLL
WHERE ABS(MainTableLongitude - Longitude) < 0.014347 
AND   ABS(MainTableLongitude - Latitude)< 0.023033
GROUP BY Crime_type,MONTH

为了更有意义,您需要将表中的一些列添加到 select 并按部分分组。

在@Serif 回答中尝试使用 INNER JOIN 而不是 WHERE

SELECT Month, Crime_type, COUNT(*) as TOTAL
FROM MainTable m
INNER JOIN TableLL t
   on ABS(m.MainTableLongitude - t.Longitude) < 0.014347 
  and ABS(m.MainTableLongitude - t.Latitude) < 0.023033
GROUP BY Crime_type,MONTH

您还应该考虑使用来自 sql 服务器的 spatial query。您可以创建空间索引以提高整体性能。

你是对的。你的方法更明智。跳过上一个答案。

SELECT 
    Month, Crime_type, count(*) as TOTAL
FROM 
    MainTable
WHERE 
    EXISTS (
            SELECT 1 FROM TableLL 
            WHERE ABS(MainTableLongitude - Longitude) < 0.014347 
            AND   ABS(MainTableLongitude - Latitude ) < 0.023033
           )
GROUP BY Crime_type,MONTH