【问题标题】:Subtract nonconsecutive values in same row in t-SQL减去t-SQL中同一行中的不连续值
【发布时间】:2015-09-28 14:59:47
【问题描述】:

我有一个包含年度数据点和季度数据点的数据表。我想从相应的先前年度条目中减去季度数据点,例如2014 年年度 - 2014 年第三季度,使用 t-SQL。我为每个条目都有一个 id 变量,加上一个 reconcile id 变量,该变量显示哪个季度条目对应于哪个年度条目。见下文:

CurrentDate PreviousDate Value  Entry Id  Reconcile Id  Annual/Quarterly
9/30/2012   9/30/2011    112      2            3             Annual
9/30/2013   9/30/2012    123      1            2             Annual
9/30/2014   9/30/2013    123.5    9            1             Annual
12/31/2013  9/30/2014    124      4            1            Quarterly
3/31/2014   12/31/2013   124.5    5            1            Quarterly
6/30/2014   3/31/2014    125      6            1            Quarterly
9/30/2014   6/30/2014    125.5    7            1            Quarterly
12/31/2014  9/30/2014    126      10           9            Quarterly
3/31/2015   12/31/2014   126.5    11           9            Quarterly
6/30/2015   3/31/2015    127      12           9            Quarterly

例如,季度分录的核对 ID 9 对应于年度分录的条目 ID 9。

我有代码可以从当前条目中减去之前的条目,但我不知道如何从条目 ID 和协调 ID 相同的年度条目中减去季度条目。

这是我正在使用的代码,它导致正确的计算,但结果的数量增加了很多行。我也尝试过将其作为内部连接。我只想要原来的 10 行,加上一个新的差异列:

 SELECT DISTINCT T1.[EntryID] 
    , [T1].[RECONCILEID] 
    , [T1].[CurrentDate] 
    , [T1].[Annual_Quarterly] 
    , [T1].[Value] 
    , [T1].[Value]-T2.[Value] AS Difference 
    FROM Table T1 
    LEFT JOIN Table T2 ON T2.EntryID = T1.RECONCILEID;

【问题讨论】:

  • 你能举个例子说明你想要得到的结果吗?
  • 这可以通过自联接或相关子查询轻松完成。谷歌一个或两个例子。
  • 是我遗漏了什么,还是您按每个字段分组?使用“select distinct”不是更简单吗?
  • @JulienBlanchard 公平点。已更新。
  • 在您的问题中,听起来您想在 entryID = reconcileID 上将您的表加入到自身中,但是在您的示例中展示了您尝试过的内容,您引入了 statementID。 statementID 字段与 entryID 和 reconcileID 有什么关系?

标签: sql sql-server


【解决方案1】:

您的代码应该没问题,这是我得到的结果:

EntryId Annual_Quarterly    CurrentDate ReconcileId Value   recVal  diff
2       Annual              9/30/2012   3           112     
1       Annual              9/30/2013   2           123     112     11
9       Annual              9/30/2014   1           123.5   123     0.5
4       Quarterly           12/31/2013  1           124     123     1
5       Quarterly           3/31/2014   1           124.5   123     1.5
6       Quarterly           6/30/2014   1           125     123     2
7       Quarterly           9/30/2014   1           125.5   123     2.5
10      Quarterly           12/31/2014  9           126     123.5   2.5
11      Quarterly           3/31/2015   9           126.5   123.5   3
12      Quarterly           6/30/2015   9           127     123.5   3.5

使用您的数据和此 SQL:

SELECT  
    tr.EntryId, 
    tr.Annual_Quarterly, 
    tr.CurrentDate,
    tr.ReconcileId, 
    tr.Value, 
    te.Value AS recVal, 
    tr.[VALUE]-te.[VALUE] AS diff
FROM 
    t AS tr LEFT JOIN 
    t AS te     ON 
    tr.ReconcileId = te.EntryId
ORDER BY 
    tr.Annual_Quarterly, 
    tr.CurrentDate;

【讨论】:

    【解决方案2】:

    就您希望如何减去这些值而言,您的问题有点模糊,但这应该会给您一些想法。

    Select      T1.*, T1.Value - Coalesce(T2.Value, 0) As Difference
    From        Table   T1
    Left Join   Table   T2  On  T2.[Entry Id] = T1.[Reconcile Id]
    

    【讨论】:

    • 谢谢,Siyual。这并不完全符合我的要求。通过示例获取更多信息:我想从具有条目 ID = 9 的值中减去每个具有协调 ID = 9 的值,从而为每个观察结果生成一个差异变量。最后,按照这个例子,我们看到条目 ID = 9 的观察值是 123.5,所以我希望差异列从协调 ID = 9 的每个值中减去 123.5。跨度>
    • @Jacob 你能用你从查询中寻找的预期结果更新你的问题吗?
    • @Jacob 我已经更新了查询 - 这个应该会给你你正在寻找的结果。
    • 谢谢@Siyual!你的代码让我走上了正轨,但发生了一些奇怪的事情。当我包括差异计算时,观察的数量从 10 行增加到 668 行。我用我正在使用的代码更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 2018-06-05
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2019-11-09
    相关资源
    最近更新 更多