1

複雑な検索シナリオ用の SQL ステートメントを作成しようとしていますが、皆さんの助けが必要です。シナリオは次のとおりです。

私は、マーチャントがそれにサインアップし、各製品に提供する最高の価値 (最大の金額) を提供し、ユーザーが自分の場所を提供し、各製品の量/キロ数を提供できるサービスを提供しようとしています。彼らは自分の値を入力フォームに入力してから、SQLにすべての商人をTOTALで提供する金額とともにリストし、最も多いものが上から始まるようにします。

Merchants テーブルと MerchantProducts テーブルと Locations テーブルを含むデータベースがあります。各加盟店には 20 個の商品があり、これらの商品はすべての加盟店で同じです。

Merchant Table I have:
UserID (which is merchant's unique id)
MerchantName
MerchantTelNo
MerchantIsActive

MerchantProducts Table I have:
MerchantProductID
UserID
MerchantProductName
MerchantProductValue
MerchantProductLastUpdated

私がやろうとしていることは次のとおりです。

1- ユーザーが持っている製品の量を入力できる製品フォームがあります。製品のリストには、製品の名前(ラベル)とそれらが持っている量(テキストボックス)のみが含まれています。製品の量は、製品の値で乗算されます。

2- ユーザーは自分の場所を入力します。

3- SQL フィルは近くの商人を見つけ、最も多い金額が一番上に、最も少ない金額がその下にリストされる場所をリストします。

これまでのところ、ユーザーが 1 つの製品のみを選択して場所を入力すると、最も多くの金額が提供された 1 つのマーチャントの返品を受け取ることができました。次の SQL ストアド プロシージャでこれを実現しました。

ALTER PROCEDURE [dbo].[GetNearbyLocations2] 
@ChosenProduct VARCHAR(100),
@CenterLatitude FLOAT, 
@CenterLongitude FLOAT, 
@SearchDistance FLOAT, 
@EarthRadius FLOAT AS DECLARE @CntXAxis FLOAT DECLARE @CntYAxis FLOAT DECLARE @CntZAxis FLOAT 
SET @CntXAxis = COS(RADIANS(@CenterLatitude)) * COS(RADIANS(@CenterLongitude)) 
SET @CntYAxis = COS(RADIANS(@CenterLatitude)) * SIN(RADIANS(@CenterLongitude)) 
SET @CntZAxis = SIN(RADIANS(@CenterLatitude)) 


SELECT TOP 100 *,
ProxDistance = @EarthRadius * ACOS( dbo.XAxis(latitude, longitude)*@CntXAxis + dbo.YAxis(latitude, longitude)*@CntYAxis + dbo.ZAxis(latitude)*@CntZAxis) 
FROM MerchantProducts AS M INNER JOIN Locations AS L ON M.UserID = L.UserID INNER JOIN (SELECT MAX(M.MerchantProductValue) AS MerchantProductValue FROM Locations AS L LEFT OUTER JOIN MerchantProducts AS M On L.UserID = M.UserID 
WHERE (M.MerchantProductName = @ChosenProduct AND @EarthRadius * ACOS( dbo.XAxis(latitude, longitude)*@CntXAxis + dbo.YAxis(latitude, longitude)*@CntYAxis + dbo.ZAxis(latitude)*@CntZAxis) <= @SearchDistance))
AS MX ON M.MerchantProductValue = MX.MerchantProductValue
AND M.MerchantProductName = @ChosenProduct
AND latitude IS NOT NULL ORDER BY ProxDistance ASC

いいえを達成するためにストアドプロシージャを作成しようとしています。1,2 & 3. 基本的に、ユーザーが各製品について何kgの製品を持っているかを入力してから、SQLで各マーチャントを調べて、どのマーチャントがすべての合計金額が最も多いかを調べます。ユーザーがリストに値を入力した製品。

事前に感謝します。私の質問がうまくいくことを願っています。

4

1 に答える 1

0

あなたが説明しているのは、「場所と価格に基づいて注文を処理する」という最適化の問題だと思います。各距離に「送料」を割り当てたいと思うかもしれません。そうしないと、最良の価格と最良の場所を同時に最適化することができないかもしれません.

単一の製品の場合、SQL Server の共通テーブル式を使用して記述できる再帰クエリを使用して、これをエレガントに解決できる場合があります。CTE 内の最初のシード行は、ユーザーの場所と製品の全数量です。次に、再帰部分は、場所と数量 * 価格の合計コストをリストするクエリから上位にランク付けされた行を引き出し、シード行から利用可能な金額を差し引いて、残りの製品数量を含む 2 番目の行を作成します。その後、数量がなくなるまで繰り返します。おそらく、前の行のマーチャント リストを使用して、同じマーチャントを複数回含めることを避ける必要があるためです。各反復で常にトップランクの商人がいると思うので、それが役立ちます.

複数の製品の場合、複数の行 (または複数の動的列) の「シード」から開始するか、各製品を個別に計算してから結果をマージする必要がある場合があります。

おそらく、このプロセスは、必要に応じて、ループ、実行中の変数、および一時テーブルを使用して、より機能的に達成することもできます。

共通テーブル式を使用した再帰クエリ

于 2012-06-15T05:43:26.107 に答える