2017-11-26 12 views
0

SQL FUNCTIONを作成しようとしています。ここで "a_id"を入力します。 SQLは3つの異なるc_idに基づいて最小コストを返します。 マイテーブルは以下の通りです。一例として単一SQL関数(SQL Server 2014)の2つのSELECTステートメントに基づいてMINIMUM値を計算

TB1 : A (a_id (pk),a_name,a_description,a_qh) 
TB2: AC (ac_id (pk),a_id(fk),c_id(fk),ac_cost) 
TB3: C (c_id(pk),c_name) 

:I 1のテーブル及びI入力A_ID下回っている場合、次にSQLはそのSQLに基づいて、次に1のA_IDに関連するすべてのC_IDを見つけることができなければならないベースの最小値を計算することができなければなりませんコスト。 A_IDの例を下回る= 1つのSQLは1の私にC_IDを返す必要がありますするために、それは150155のうち150の最低のコストであり、そして以来、160:

文1:2つのSELECTステートメントは、これを実現するため、私が作成した

a_id a_description   c_id Cost 
    1 RS      1 150.0000 
    2 BS      1 145.0000 
    3 GS      1 130.0000 
    1 RS      2 155.0000 
    14 GH      2 120.0000 
    1 RS      3 160.0000 
    14 GH      3 125.0000 

SELECT 
    c_id, Cost, a_id 
FROM 
    AC 
WHERE 
    a_ID = 1); -- This code returns all c_id associated with one a_id 

書2:

SELECT 
    MIN(AC.cost), c_id, a_ID 
FROM 
    AC 
WHERE 
    a_ID = 1 
GROUP BY 
    c_id, a_ID 
HAVING 
    MIN(AC.COST) <= (SELECT MIN(AC.COST) FROM AC) -- This code calculates minimum cost based on 3 different c_id. AS 1 a_id can be sell be 3 different c_id 

私のジレンマです:どのように私は上記の2つのSELECTステートメントを単一の機能で最低のac.Costを達成するために使用する必要がありますか?

ありがとうございます!

+0

どのRDBMSを使用していますか、あなたのPRIMARY KEYは何ですか? – Strawberry

+0

@Strawberry ..私はSQL Server 2014を使用しています。私の質問に私のPKを反映するように更新しました – biggboss2019

答えて

1

私はあなたが見ているものに基づいて他のテーブルが必要だとは思わない、ちょうどAC。ここにランククエリがあります

select * 
from 
    (select 
     *, 
     rank() over (partition by a_id order by cost asc) as cost_rank 
    from 
     AC) a 
where 
    cost_rank = 1 and a_id = 1 
+0

ありがとう! 2番目のselect文がa_id = 1を入力したときにc_idを表示しない理由は何ですか?a_id = 14を入力するとc_id = 2が表示されます。私はSECOND SELECTステートメントを更新しました。 – biggboss2019

+1

2番目の選択のサブクエリを '<=(SELECT MIN(AC.COST)FR AC AC WHERE a_ID = 1)'に変更します。または、2つ目の選択肢を2つの節点で囲み、そこから選択し、最後に 'WHERE a_ID = 1'節を追加します。あなたがランキング機能を使用するだけではない理由を理解していない。しかし、答えを正しく記入してください。 –

+0

ありがとうございました。私はRANKについて読んで始めましたが、以前はこれを使ったことはありません。しかし、それは良いアプローチのように聞こえる。再度、感謝します! – biggboss2019

関連する問題