繁体   English   中英

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

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

我有一个查询,该查询在同一张表上使用内部联接并计算一些余额。 我为此使用分区。 并根据余额值减去一些日期。

我的查询工作正常,但是有问题。 如果连接的平衡天数最终为零,则我需要所有具有相同BrojDoK (内部连接所基于的列)的列都为零。

这是我到目前为止的结果:

在此处输入图片说明

我需要的是在这种情况下,对于BrojDok = 648 ,由于末尾的BalanceTotal为0,因此我还需要FinID = 5856BalanceDays也为零。

我想得到这样的东西:

在此处输入图片说明

我能以某种方式计算另一列可以做到这一点吗?

我一直在寻找更新方法,但是我无法对此做任何事情。

到目前为止,这是我的查询:

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

由于末尾的BalanceTotal为0,我需要FinID = 5856的BalanceDays也为零。

在这一行:

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

将S2.BalanceTotal替换为一个子查询,该子查询“最后”检查BalanceTotal。

如果有人需要这样的东西,我找到了解决方案,我只添加了计算MIN OVER PARTITION BY的列。

就我而言:

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

暂无
暂无

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

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