2017-12-12 14 views
1

私は、同じテーブルの内部結合を使用していくつかのバランスを計算するクエリを持っています。私はこのためにパーティションを使用しています。バランスの値によっては、いくつかの日付を減算しています。SQL Serverサブクエリ内部結合の1つの列に基づいて他の列値を定義する方法は?

私のクエリは問題なく動作しますが、問題があります。最後に結合の平衡日をゼロにする場合、同じBrojDoK(内部結合の基になる列)のすべての列がゼロになる必要があります。

これは私がこれまで持っているものの結果である:私は必要なもの

enter image description here

は終わりが0であるため、この場合には、BrojDok = 648のために、私はFinID = 5856ためBalanceDaysが必要だということですまたゼロになる。

enter image description here

私は何とかこれを行うだろう別の列を計算することができます。

私はこのような何かを取得したいのでしょうか?

私は更新方法を探していましたが、何もすることができませんでした。

これは、これまでのところ、私のクエリです:

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

終わりBalanceTotalが0であるから、私もゼロであることを FinID = 5856用BalanceDaysを必要としています。この行に

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

"末尾に" BalanceTotalをチェックサブクエリとS2.BalanceTotalを交換。

+0

私はそれを行う方法を見当もつかない.. – Alexander

0

誰かがこのようなものを必要とする場合、解決策を見つけました。MIN OVER PARTITION BYを計算する列を追加するだけです。私の場合は

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

これは、あなたがあなたの質問にたいと言っていた何をしません。あなたは、 "最後に"という値がゼロだったら、値をゼロに設定したかったと言っていました。これを行うと、最後の値がゼロかどうかをMINに設定します。そしてそれはあなたが望むものかもしれませんが、あなたが求めたものではありません。 –

関連する問題