2017-10-26 6 views
0

누락 된 총 금액 (손실 * 금액)이 가장 적은 행의 합계를 출력하려고 시도하는 경우 입력 (수량)이 사용 예 3의 입력은 최하위 3 행의 합계를 반환합니다. MariaDB 사용 현재 코드 : I가 정확하게 판독되면 입력이 주어입력에 의해 SQL 함수에 의해 생성 된 행의 수를 제한

DELIMITER ++ 
CREATE FUNCTION TotalLoss (quantity INT) returns INT 
WITH cte AS (
    SELECT 
     M.lost*C.Number AS total, 
     ROW_NUMBER() OVER (ORDER BY M.Lost*C.Number) AS row 
    FROM Money M 
    JOIN Company C 
     ON M.Id = C.MId 
) 
SELECT SUM(total) FROM cte WHERE row = quantity; 
DELIMITER ; 

TABLE Money (Id, lost) has values (1, 10), (2,40), (3,90), (4,100) 
Table Company (MId, Number) has values (3, 4), (1,2), (5, 1), (4,1) 

는, 출력이 낮은 두 가지 (10 * 2 + 100 * 2)

답변

0

이후 220

quantity3라면 위의, 예를 들어,

SELECT SUM(total) FROM cte WHERE row <= quantity; 

: 당신은 행 번호의 불평등 비교를 사용할 수 있어야합니다 쿼리는 처음 세 (가장 낮은) 행의 총계를 합산합니다.

두 개 이상의 합계가 연결될 경우 어떤 일이 일어나는지 언급하지 않았습니다. 이 경우 행 번호 대신 순위 함수를 사용하는 것이 더 적합 할 수 있습니다.

편집 :

당신이 MySQL의에서 같은 일을하고 싶었다면, 당신은 어떤 나중에 (이 수도 있지만 행 번호 기능을 내장 지원하지 않기 때문에, 더 많은 작업을해야 할 것). 이를 위해, 우리는 행 번호를 추적하는 세션 변수를 사용할 수 있습니다

SELECT SUM(total) 
FROM 
(
    SELECT 
     (@rn:[email protected] + 1) AS rn, 
     M.lost*C.Number AS total 
    FROM Money M 
    INNER JOIN Company C 
     ON M.Id = C.MId 
    INNER JOIN (@rn:=0) t 
    ORDER BY 
     total 
) t 
WHERE 
    t.rn <= 3; 

이 저장 프로 시저의 내부뿐만 아니라 일반 쿼리로 실행해야합니다. 함수 내에서이 작업을 수행해야하는 경우 세션 변수가 지원되지 않을 수 있으므로 일부 섬세한 커서 작업을 구현해야 할 수도 있습니다. 이들이 지원되지 않을 수있는 이유는 세션 변수의 값이 변경 될 수 있기 때문에 동일한 입력이 주어지면 함수가 항상 같은 값을 반환하지 않기 때문입니다.

+0

감사! mysql을 사용하여 같은 것을 달성하는 방법은 무엇입니까? –

+0

@ J.Doe MySQL 함수에서 이것이 가능한지 확신 할 수 없습니다. 저장 프로 시저 또는 일반 쿼리를 받아 들일 수 있습니까? –

+0

이 함수는 –

관련 문제