2017-12-29 34 views
3

나는 두 날짜 사이의 최소 금액을 얻기위한 몇 가지 논리, 내가 '2017-12-31'.I을'2017년 12월 1일 '사이의 각 예금의 균형 적어도 원하는Sql을 사용하여 두 날짜 사이의 최소 금액을 얻는 방법?

create table #tmp(id int,deposit_id int,transaction_amount decimal(15,2),trn_date date,trn_type varchar(50)); 
insert into #tmp 
select 1,101,15000,'2017-12-01','Receipt' -- 15000 
union all 
select 2,101,-5000,'2017-12-09','Payment' -- 10000 
union all 
select 3,101,6000,'2017-12-16','Receipt' --16000 
union all 
select 4,101,-15000,'2017-12-20','Payment' -- 1000 
union all 
select 5,101,10000,'2017-12-22','Receipt' --11000 
union all 
select 5,101,-1000,'2017-12-22','Payment' --10000 
union all 
--- another deposit details 
select 55,102,50000,'2017-12-04','Receipt' -- 50000 
union all 
select 56,102,5000,'2017-12-10','Receipt' -- 55000 

처럼 내 테이블이 필요 내가 어떻게 2017-12-24'.Please '에, 예를 들어 하루에 잔액을 확인할 수 있기 때문에 캔트이 결과를 얻기 위해 쿼리에 대한 논리를 얻을 줄 몇 가지 tips.My 원하는 결과는

deposit_id date LeastAmt 
    101 - '2017-12-20' - 1000 
    102 - '2017-12-04' - 50000 

답변

3

이 질문은 할 수있다 두 부분으로 나뉩니다. 먼저, 예금 테이블에 대한 롤링 밸런스를 계산해야합니다. 그런 다음 지정된 기간 내에 각 계정에 대해 가장 작은 잔액을 찾아야합니다.

WITH cte AS (
    SELECT d1.*, 
     (SELECT SUM(d2.transaction_amount) FROM deposits d2 
     WHERE d1.deposit_id = d2.deposit_id AND d2.trn_date <= d1.trn_date) bal 
    FROM deposits d1 
) 

SELECT 
    id, deposit_id, transaction_amount, bal, trn_date, trn_type 
FROM 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY deposit_id ORDER BY bal) rn 
    FROM cte 
    WHERE trn_date BETWEEN '2017-12-01' AND '2017-12-31' 
) t 
WHERE t.rn = 1; 
+0

선생님은 내가 오류 'D2'에 대한 –

+0

@PrasannaKumarJ 오타't2.transaction_amount'을 bound.' 할 수없는 여러 부분으로 구성된 식별자 "t2.transaction_amount"를 얻었다. transaction_amount' –

0

사용 ORDER BYbalance 열 아래와 같이에 :

참고 : 나는 MySQL의 예를 제공하고, 당신은 당신의 DB 서버와 동일한 로직을 수행 할 수 있습니다. 노동 조합에서 다음과 같이 사용할 수있는 같은 값이 동적 인 경우

SELECT balance 
FROM table_name 
WHERE date_created BETWEEN date1 AND date2 
ORDER BY balance limit 1; 

:

SELECT balance 
FROM (
    SELECT bal1, date_created 
    FROM table1 
    UNION 
    SELECT bal2, date_created 
    FROM table2 
    UNION... 
) AS A 
WHERE date_created BETWEEN date1 AND date2 
ORDER BY balance limit 1; 
+0

균형 필드가 없습니다. 계산 된 동적 필드입니다. –

+1

어떤 값을 기준으로 동적입니까? 당신이 노조를하고 있다면, 또한 당신은 사용할 특별한 가치를 꺼낼 수 있습니다. – P3arl

2

여기에 대체 솔루션입니다.

CREATE TABLE #tmp(id int,deposit_id int,transaction_amount decimal(15,2),trn_date date,trn_type varchar(50)); 

INSERT INTO #tmp 
SELECT 1,101,15000,'2017-12-01','Receipt' 
UNION ALL 
SELECT 2,101,-5000,'2017-12-09','Payment' 
UNION ALL 
SELECT 3,101,6000,'2017-12-16','Receipt' 
UNION ALL 
SELECT 4,101,15000,'2017-12-20','Payment' 
UNION ALL 
SELECT 5,101,10000,'2017-12-20','Receipt' 
UNION ALL 
SELECT 55,102,50000,'2017-12-04','Receipt' 
UNION ALL 
SELECT 56,102,5000,'2017-12-10','Receipt' 

SELECT id, date, transaction_amount 
FROM (
    SELECT trn_date AS date, MIN(transaction_amount) AS LeastAmt 
    FROM #tmp 
    WHERE trn_date BETWEEN '2017-12-01' AND '2017-12-31' 
    GROUP BY trn_date 
    ) A 
    INNER JOIN #tmp ON trn_date = A.date AND transaction_amount = A.LeastAmt 
ORDER BY id 

DROP TABLE #tmp 
+0

영업 이익은 최소 거래 금액이 아니라 최소 잔액을 원합니다. 롤링 균형을 먼저 계산해야합니다. –

+0

@TimBiegeleisen 오, 질문에 명확하지 않았습니다. – Danieboy

0

이 시도 :

SELECT deposit_id,trn_date,transaction_amount 
FROM tmp t 
WHERE trn_date >= '2017-12-01' AND 
    trn_date <= '2017-12-31' AND 
    transaction_amount = (
     SELECT MIN(transaction_amount) 
     FROM tmp 
     WHERE t.deposit_id=deposit_id AND 
      trn_date >= '2017-12-01' AND 
      trn_date <= '2017-12-31')