2017-12-12 22 views
1

동일한 테이블에서 내부 조인을 사용하는 쿼리를 사용하여 균형을 계산합니다. 나는 이것을 위해 파티션을 사용하고 있습니다. 밸런스 값에 따라 일부 날짜가 공제됩니다.SQL Server 하위 쿼리 내부 조인에서 하나의 열을 기반으로 다른 열 값을 정의하는 방법은 무엇입니까?

내 쿼리는 정상적으로 작동하지만 문제가 있습니다. 마지막 날에 조인의 균형 일 수가 0 인 경우 모든 동일한 열 (내부 조인이 기반으로하는 열)이 0이어야합니다.

enter image description here

내가 필요로하는 말에 가 0이기 때문에이 경우, BrojDok = 648를 들어, 나는 BalanceDaysFinID = 5856을 위해 필요하다는 것입니다 :

내가 지금까지 가지고있는 결과입니다 또한 0이됩니다.

enter image description here

어떻게 든 이런 짓을 했을까 다른 열을 계산할 수 있습니다

나는 이런 식으로 뭔가를 좀하고 싶습니다?

업데이트 방법을 찾고 있었지만 아무 것도 할 수 없었습니다.

이 지금까지 내 쿼리입니다 : 마지막에 BalanceTotal가 0이기 때문에 또한 제로로

SELECT 
    S2.FinID, S2.Firma, S2.Konto, S2.Partner, 
    S2.BrojDok, S2.DatumVal, S2.pot, S2.dug, 
    S2.Balance, S2.BalanceTotal, 
    IIF(S2.BalanceTotal > 0, 
     IIF(S2.BalanceTotal < 1, DATEDIFF(DAY, S2.MinDate, S2.MaxDate), 
           DATEDIFF(DAY, S2.DatumVal, GETDATE())), 
    IIF(S2.BalanceTotal = 0, 0, 0)) AS BalanceDays 
FROM 
    (SELECT 
     S1.FinID, S1.Firma, S1.NazFirme, S1.Konto, S1.NazivKonta, 
     S1.Partner, S1.NazivPartnera, S1.BrojDok, S1.DatumVal, 
     S1.pot, S1.dug, S1.Balance, S1.MaxDate, S1.MinDate, 
     SUM(S1.Balance) OVER (PARTITION BY S1.BrojDok ORDER BY S1.FinID) AS BalanceTotal 
    FROM 
     (SELECT 
       t1.FinID, t1.Firma, t1.NazFirme, t1.Konto, t1.NazivKonta, 
       t1.Partner, t1.NazivPartnera, t1.BrojDok, t1.DatumVal, 
       SUM(t1.Duguje) AS dug, SUM(t1.Potrazuje) AS pot, 
       SUM(IIF(t1.[Konto] LIKE '2%', t1.[Duguje] - t1.[Potrazuje], t1.[Potrazuje] -t1.[Duguje])) AS Balance, 
       MAX(t2.DatumVal) AS MaxDate, 
       MIN(t2.DatumVal) AS MinDate 
      FROM 
       tblFinansijskiPodaci t1 
      INNER JOIN 
       tblFinansijskiPodaci t2 ON t1.BrojDok = t2.BrojDok 
      WHERE 
       t1.Firma = 1 AND t1.Konto = 2040 AND t1.Partner = 1102 
       AND t2.Firma = 1 AND t2.Konto = 2040 AND t2.Partner = 1102 
     GROUP BY 
      t1.FinID, t1.Firma, t1.NazFirme, t1.Konto, t1.NazivKonta, 
      t1.Partner, t1.NazivPartnera, t1.BrojDok, t1.DatumVal) AS S1 
    ) AS S2 
ORDER BY 
    BrojDok 

답변

0

가, 나는 FinID = 5856 의 BalanceDays이 필요합니다. 이 라인

:
IIF(S2.BalanceTotal = 0, 0, 0)) AS BalanceDays 

"는 말의"BalanceTotal을 확인 부질 S2.BalanceTotal으로 바꾸기.

+0

나는 그것을 수행하는 방법 단서가 없다 .. – Alexander

0

누군가가 이와 같은 것을 필요로하는 경우 솔루션을 찾았습니다. MIN OF PARTITION BY를 계산하는 열을 추가하기 만하면됩니다. 내 경우

:

MIN(S3.BalanceDays) OVER (PARTITION BY S3.BrojDok) AS BalanceDays1 
+0

이 당신이 당신의 질문에 원하는 말을하지 않습니다. "at the end"값이 0이면 값을 0으로 설정하기를 원한다고 말했죠. 이렇게하면 끝에있는 값이 0인지 여부에 관계없이 MIN으로 설정됩니다. 그리고 아마도 그것이 당신이 원하는 것이 겠지만, 당신이 요구 한 것이 아닙니다. –