简体   繁体   English

SQL Server如何基于子查询内部联接上的一列定义其他列值?

[英]SQL Server how to define other column values based on one column on subquery inner join?

I have a query that uses inner join on the same table and calculates some balance. 我有一个查询,该查询在同一张表上使用内部联接并计算一些余额。 I am using partition over for this. 我为此使用分区。 And depending on the balance value, it is subtracting some dates. 并根据余额值减去一些日期。

My query works fine, but I have a problem. 我的查询工作正常,但是有问题。 If I have balance days at the join to be zero at the end, I need all columns with the same BrojDoK (column that the inner join is based on) to be zero. 如果连接的平衡天数最终为零,则我需要所有具有相同BrojDoK (内部连接所基于的列)的列都为零。

This is the result what I have so far: 这是我到目前为止的结果:

在此处输入图片说明

What I need is that in this case, for BrojDok = 648 , since the BalanceTotal at the end is 0, I need the BalanceDays for FinID = 5856 also to be zero. 我需要的是在这种情况下,对于BrojDok = 648 ,由于末尾的BalanceTotal为0,因此我还需要FinID = 5856BalanceDays也为零。

I would like to get something like this: 我想得到这样的东西:

在此处输入图片说明

Can I somehow calculate another column that would do this? 我能以某种方式计算另一列可以做到这一点吗?

I was looking the update method, but I couldn't manage to do anything with it. 我一直在寻找更新方法,但是我无法对此做任何事情。

This is my query so far: 到目前为止,这是我的查询:

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

since the BalanceTotal at the end is 0, I need the BalanceDays for FinID = 5856 also to be zero. 由于末尾的BalanceTotal为0,我需要FinID = 5856的BalanceDays也为零。

In this line: 在这一行:

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

Replace S2.BalanceTotal with a subquery that checks the BalanceTotal "at the end". 将S2.BalanceTotal替换为一个子查询,该子查询“最后”检查BalanceTotal。

If someone needs something like this, I have found the solution.I just add the column that calculates the MIN OVER PARTITION BY. 如果有人需要这样的东西,我找到了解决方案,我只添加了计算MIN OVER PARTITION BY的列。

In my case: 就我而言:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM