2017-08-03 234 views
4

我使用下面的目的地计算距离

[BMAnalytics].[dbo].[EUACTIVESTORES] 

而且它有列

[Store No] 
[Lat] 
[Long] 

我可以使用这些列自加入[店号]所以我有两个列中列出的每个组合存储到商店名为'来源'&'目标'

然后在第三列可以计算距离之间的距离两个?

我已经使用了以前下面但这只是一个单点的作品,以点带面,

DECLARE @source geography = 'POINT(0 51.5)' 
DECLARE @target geography = 'POINT(-3 56)' 

SELECT (@source.STDistance(@target))/1000 

理想的情况下,我想每个分支等

任何指导,从每个分支的距离是

回答

3

这里使用的是自加入

如果可以一个简单的例子欢迎,我建议增加一个字段,其中包含摹源表eography Point,从而消除每次运行查询时计算此值的需要。

Declare @YourTable table ([Store No] int,Lat float,Lng float) 
Insert Into @YourTable values 
(1,-8.157908, -34.931675) 
,(2,-8.164891, -34.919033) 
,(3,-8.159999, -34.939999) 

Select [From Store] = A.[Store No] 
     ,[To Store] = B.[Store No] 
     ,Meters  = GEOGRAPHY::Point(A.[Lat], A.[Lng], 4326).STDistance(GEOGRAPHY::Point(B.[Lat], B.[Lng], 4326)) 
From @YourTable A 
Join @YourTable B on A.[Store No]<>B.[Store No] 

返回

enter image description here

编辑如果你可以添加地理野外

Update YourTable Set GeoPoint = GEOGRAPHY::Point([Lat], [Lng], 4326) 

然后计算将是

,Meters = A.GeoPoint.STDistance(B.GeoPoint) 
+0

这有很大帮助,但我要申报每个门店长LAT? – PeterH

+0

@ user91504不可以。(at)YourTable只是一个用于演示的表变量。您可以删除SELECT以上的所有内容并提供您的实际表名 –

+0

不用担心我现在可以工作 – PeterH

3

最终的查询是这样的:

SELECT 
     A.[STORE NO] AS 'SOURCE' 
     ,B.[STORE NO] AS 'TARGET' 
     ,CONVERT(DECIMAL(6,2),(((GEOGRAPHY::Point(A.[Lat], A.[Long], 4326).STDistance(GEOGRAPHY::Point(B.[Lat], B.[Long], 4326)))/1000)/8)*5) AS 'MILES' 

FROM 
     [bhxsql2014-dev].[BMAnalytics].[dbo].[EUACTIVESTORES] A 
JOIN 
     [bhxsql2014-dev].[BMAnalytics].[dbo].[EUACTIVESTORES] B on A.[Store No]<>B.[Store No] 

WHERE 
     A.LAT  IS NOT NULL 
    AND A.[STORE NO] IS NOT NULL 
    AND B.LAT  IS NOT NULL 
    AND B.[STORE NO] IS NOT NULL 
+0

干得好。 FYI将仪表转换为英里,您可以{meter} /1609.344 –