使用 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
我有 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