比较相同 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。
我有一个 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。