2016-11-07 14 views
1

私は、複数の物流センター(DC)と複数の店舗を持つトラック輸送の問題に取り組んでいます。私はDCと店舗の両方に経度と緯度を持っています。私はどのように47の異なるDCの経度と緯度と4500+の経度と緯度をループし、それぞれの最短距離を見つけるかわからない。私はこのような何かを考えていた(私は一時テーブルが間違っていると思う):ループ内のSQLで複数の距離を見つける

CREATE TEMPORARY TABLE tempStores AS (SELECT * FROM wm_stores) 

SET i = 0; 
WHILE i <= (SELECT COUNT(*) FROM tempStores) - 1 DO 
    SELECT store_id FROM tempStores LIMIT i,1 INTO thisStoreID; 
    SELECT store_id FROM tempStores LIMIT i,1; 

    SET i = i + 1; 
END WHILE; 

DECLARE storeLat DOUBLE; 
DECLARE storeLon DOUBLE; 
DECLARE dcLat DOUBLE; 
DECLARE dcLon DOUBLE; 
DECLARE storeLatRad DOUBLE; 
DECLARE storeLonRad DOUBLE; 
DECLARE dcLatRad DOUBLE; 
DECLARE dcLonRad DOUBLE; 
DECLARE R DOUBLE; 
DECLARE distance DOUBLE; 
SET R = 3961;      
SET storeLat = 37.350659; ## <-- Basically Loop this here 
SET storeLon = -76.734855; ## <-- Here 
SET dcLat = 37.192498;  ## <-- Here 
SET dcLon = -77.534201;  ## <-- And here... instead of having it all hard coded. 
SET storeLatRad = PI() * storeLat/180.0;  
SET storeLonRad = PI() * storeLon/180.0;  
SET dcLatRad = PI() * dcLat/180.0;   
SET dcLonRad = PI() * dcLon/180.0;  

答えて

0

は、だからあなたは、各店舗のため、最寄りの物流センターを特定する必要がありますか?

この情報を得るには、各店舗と各配送センター間の距離を知る必要があります。あなたはループでこれを行うことを提案していますが、代わりにSQLでそれを行い、すべてのデータを一時テーブル(またはサブクエリ)に入れると、アウトラインロジックは次のようになります:

SELECT y.StoreID, z.DCID, y.ClosestDCDistance as Distance 
FROM (
    SELECT StoreID, Min(StoreDCDistance) as ClosestDCDistance 
    FROM (SELECT StoreID, DCID, StoreDCDistance FROM TempTable) x 
    GROUP BY StoreID 
) y INNER JOIN ( 
    SELECT StoreID, DCID, StoreDCDistance FROM TempTable 
) z ON y.StoreID = z.StoreID AND y.ClosestDCDistance = z.StoreDCDistance 

必要に応じて、これをCTEで整理できます。それとは関係なく、TempTableを埋めることが必要です(または、このロジックを必要に応じてサブクエリにしてください)。

SELECT StoreID, DCID, (???) as StoreDCDistance INTO TempTable 
FROM wm_Stores st, wm_DCs dc  -- haven't got name of DCs table 

私は距離を計算する方法を知らないのですか?括弧で囲まれていますが、おそらくあなたはすでにこの情報を持っています。 LatA、LngAからLatB、LngBまでの距離を計算するのに適している方程式であると仮定していますが、単純なA + B = Cという方程式は期待できません。

(PI()* st.storeLat/180)は明らかにそれの小さな要素の1つですが、他に何が必要なのかはわかりませんし、あなたの投稿には全体的な距離の計算が表示されません。

1つの計算式で計算できない場合は、LatA、LngA、LatB & LngBの値を指定して距離を計算する関数を使用する必要があります。

これが役に立ちます。

関連する問題