【问题标题】:Compare data in the same table比较同一张表中的数据
【发布时间】:2020-01-18 04:01:59
【问题描述】:

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

这是一个表格的例子

.

下面的 SQL 语句旨在返回在一段时间内发生的任何更改 - 任何基金/保单的部分或全部损失以及部分或全部收益。我已经与它斗争了一段时间 - 任何帮助将不胜感激。

我目前有 5 套工会 - (其中保单和资金匹配且持有的数量存在差异,保单存在于之前而不存在于当前,反之亦然,以及证券存在于之前和不在当前,反之亦然),但其他工会只为最后一对工作(其中证券存在于先前而不存在于当前,反之亦然)。它似乎不会每次都返回。

 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))

【问题讨论】:

  • 在您的第二个子查询中,您有一个LEFT JOINtable,但随后在WHERE 中引用它;隐含地把它变成INNER JOIN。另外,为什么要将ValDate 等列的值转换为date,然后在WHERE 中转换为varchar?这会毁掉你做过的任何表现。让它们保持原样,它们最初的日期和时间数据类型。当你确实需要转换成varchar总是声明你的长度。
  • 请编辑您的问题以显示与我们的示例数据相对应的预期输出。
  • @Larnu,感谢 cmets。我发布的表格是一个虚拟表格 - 在确切的文件/表格中,格式不是日期,但我认为您在转换为 varchar 时指定长度。
  • 桌子是假的?这与您的 SQL WHERE convert(varchar,cast(pc.[ValDate] as date),103) = convert(varchar,getdate(),103) 有什么关系?那不是您的表格,如果您在查询中这样做,那么为什么它在我们的“样本”中?
  • @Larnu,我的意思是它是一个示例表 - 由于法规,我将无法在此处发布真实数据。感谢您为我指出正确的方向,尽管关于将 LEFT JOIN 更改为 INNER JOIN 的 where 子句,但我相信您在 cmets 中可以更有礼貌。我来这里问是因为我不知道,但我很感激 - 似乎这就是问题所在。我会检查并报告。干杯

标签: sql sql-server left-join inner-join self-join


【解决方案1】:

正如@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])

并摆脱了子查询。

再次感谢拉努。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2017-04-26
    相关资源
    最近更新 更多