2017-11-26 13 views
0

내 "a_id"를 입력하면 SQL FUNCTION을 하나만 만들려고합니다. SQL은 최소한 3 개의 다른 c_id를 기반으로 최소 비용을 반환해야합니다. 내 테이블은 다음과 같습니다. 예를 들어 단일 SQL 함수 (SQL Server 2014)에서 두 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는 표 아래에 있고 I 입력 A_ID 1의 다음 SQL 기반의 최소값을 산출 할 수 있어야 SQL에 기초이어서 1. A_ID와 관련된 모든 C_ID를 찾을 수 있어야한다면 비용. A_ID 예 이하 = 1 명 SQL 1의 날 C_ID를 반환해야 것이 150,155 아웃 (150)의 낮은 비용으로, 그리고 이후 160 :

문 1 : 두 SELECT 문이를 I 작성한

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 

내 딜레마 입니다 : 내가 어떻게 두 개 이상의 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

고마워요! 두 번째 select 문이 a_id = 1을 입력 할 때 c_id를 표시하지 않는 이유는 무엇입니까?하지만 a_id = 14를 입력하면 c_id = 2가 표시됩니다. SECOND SELECT 문을 업데이트했습니다. – biggboss2019

+1

두 번째 선택에서 하위 쿼리를'<= (SELECT MIN (AC.COST) FR AC AC WHERE a_ID = 1)'로 변경하십시오. 또는 전체 두 번째 선택을 두 개의 paranthesis로 감싸고 그것을 선택하고 그 끝에 'WHERE a_ID = 1' 절을 추가하십시오. 당신이 단지 순위 기능을 사용하지 않는 이유를 이해하지 못합니다. 그래도 답을 표시하십시오. –

+0

감사합니다. 나는 RANK에 관해 읽는 것을 시작했다. 그러나 나는 그것을 결코 전에 사용하지 않고 있었다. 그러나 좋은 접근 방법 인 것 같습니다. 다시 한 번 감사드립니다! – biggboss2019