【问题标题】:SQL Server how to define other column values based on one column on subquery inner join?SQL Server如何根据子查询内连接中的一列定义其他列值?
【发布时间】:2018-05-26 15:19:22
【问题描述】:

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

我的查询工作正常,但我遇到了问题。如果我在连接处的余额天数最后为零,我需要所有具有相同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

【问题讨论】:

    标签: sql sql-server join subquery inner-join


    【解决方案1】:

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

    在这一行:

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

    将 S2.BalanceTotal 替换为“最后”检查 BalanceTotal 的子查询。

    【讨论】:

      【解决方案2】:

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

      就我而言:

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

      【讨论】:

      • 这不符合您在问题中所说的要求。您说如果“最后”的值为零,您只想将值设置为零。无论最后的值是否为零,这样做都会将其设置为 MIN。也许这就是你想要的,但这不是你所要求的。
      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2012-06-29
      • 2019-10-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      相关资源
      最近更新 更多