比较相同 table 中的数据

Compare data in the same table

我有一个 table 存储月度数据,我想比较一段时间内的数量变动。

这是 table

的示例

.

下面的 SQL 声明是指 return 一段时间内发生的任何变化 - 任何 fund/policy 部分或全部损失以及部分或全部收益。我已经为此奋斗了一段时间 - 任何帮助将不胜感激。

我目前有 5 组工会 -(保单和资金匹配,持有数量不同,以前有保单,现在没有,反之亦然,证券存在于之前而不是当前,反之亦然)但其他工会工作除了最后一对(证券存在于之前而不是当前,反之亦然)。它似乎并不是每次都 return。

 SELECT distinct pc.[Client]
      ,pc.Policy
      ,cast(pc.Qty as decimal) AS CurrQ
      ,0 AS PrevQ
      ,cast(pc.Qty as decimal) - 0 AS QtyDiff
      ,CASE WHEN cast(pc.Qty as decimal) - 0 > 0 THEN 'Bought Units'
            WHEN cast(pc.Qty as decimal) - 0 < 0 THEN 'Sold Units'
          ELSE 'Unknown'
       END AS TransactionType
       ,convert(varchar,cast(pc.[ValDate] as date),103) AS CurrValDate
       ,'' AS PrevValDate
  FROM table pc
  WHERE convert(varchar,cast(pc.[ValDate] as date),103) = convert(varchar,getdate(),103)
  AND pc.Policy IN (SELECT policy
                    FROM table
                    WHERE convert(varchar(10),[ValDate],103) = convert(varchar(10),getdate()-1,103)

  AND pc.[Fund] NOT IN (SELECT PM.[Fund]
                        FROM table pc
                        LEFT JOIN table pm ON pc.policy = pm.policy
                        WHERE convert(varchar,cast(pc.[ValDate] as date),103) = convert(varchar,getdate(),103))
                        AND convert(varchar,cast(pm.[ValDate] as date),103) = convert(varchar,getdate()-1,103))

正如@Larnu 在评论部分正确提到的那样,查询中的额外条件将 运行 从 LEFT JOIN 更改为 INNER JOIN。我将代码更改为在 ON 子句中包含政策、基金和日期:

FROM table pc
LEFT JOIN table pm ON (pc.policy = pm.policy
                       AND pc.fund = pm.fund
                       AND pc.[ValDate]-1 = pm.[ValDate])

并摆脱了子查询。

再次感谢 Larnu。