SQL SSMS IF THEN在同一字段中具有多个条件

SQL SSMS IF THEN在同一字段中具有多个条件,sql,sql-server,ssms,Sql,Sql Server,Ssms,如果交易记录类型为“C”,且记录过账时间大于或等于“W”类型记录的过账时间(其中账号和过账日期相同),则我需要从表中提取交易记录。我正在努力创建一个if/then,其中类型“C”的posttime>=类型“W”的posttime。。。任何帮助都将不胜感激。我以前做过这些类型,但从来没有针对同一个字段,其中只有一个记录项是不同的。这是我最初做的,但它只是在SSMS中搅动,没有结果。本质上,我只需要返回所有“C”类型的记录,其中有一个“W”类型的记录,其posttime小于“C”,但该记录的帐号和p

如果交易记录类型为“C”,且记录过账时间大于或等于“W”类型记录的过账时间(其中账号和过账日期相同),则我需要从表中提取交易记录。我正在努力创建一个if/then,其中类型“C”的posttime>=类型“W”的posttime。。。任何帮助都将不胜感激。我以前做过这些类型,但从来没有针对同一个字段,其中只有一个记录项是不同的。

这是我最初做的,但它只是在SSMS中搅动,没有结果。本质上,我只需要返回所有“C”类型的记录,其中有一个“W”类型的记录,其posttime小于“C”,但该记录的帐号和postdate相同。posttime、postdate、type和number都是我的表中的字段

挑选*

来自交易


其中ACTIONCODE='C'和POSTTIME>=POSTTIME和ACTIONCODE='W'

如果我理解正确,您所描述的内容可以通过连接完成。 想想关系数据集和SARG

虽然您还没有为我们提供一个非常有用的表结构,但该解决方案可以帮助您朝着正确的方向前进。下面假设一个事务事实表,其中对自身的真实性为M:M

SELECT TOP 1000 A.ACTIONCODE, A.TRAN_RECORD --, any other needed columns
FROM TRANSACTIONS A
    INNER JOIN (SELECT ACTIONCODE, POSTTIME, ACCOUNT_NUM, POSTDATE
                FROM   TRANSACTIONS
                WHERE  ACTIONCODE = 'W') B ON A.ACCOUNT_NUM = B.ACCOUNT_NUM
                                          AND A.POSTDATE = B.POSTDATE
WHERE A.ACTIONCODE = 'C'
  AND A.POSTTIME >= B.POSTTIME
更新:我不小心忘了包含正确的列数。如果您不关心将在内部联接中使用,请始终指定相同的列或*


无论如何,我们只通过返回我们将在查询中使用或看到的结果来优化查询。

这将是使用exists的典型方法:


您可以尝试添加一些您尝试添加一些上下文的代码/sql查询吗?一些示例数据和期望的结果将非常有用。您的第一个问题是您有关系数据,并且您刚才描述的大部分内容都属于ON和WHERE谓词子句。@clifton\u h无需将您的问题标记为已解决。如果一个答案解决了你的问题,那么接受这个答案——它将在列表中显示为有一个被接受的答案。@D Stanley,嗯……这不是我的问题。XD您的查询可能无法使用最有效的索引,因为您将同一列引用到自身。换句话说,可能会进行索引/表扫描。而且,这应该与问题相一致。应该马上回来的。一行不能在一列中包含多个值。谢谢Clifton_h,这非常有效。真的很感激!含糖的请将答案标记为已解决,谢谢如果一天中可以有多个W,则最终会出现重复。@shawnt00实际上不是。Join是以帐户num+Postdate和PostTime为变量的。因此,除非以天为单位度量时间,否则应该返回一个唯一的集合。
select * from transactions t
where t.actioncode = 'C' and exists (
    select 1 from transactions t2
    where   t2.account_num = t.account_num and t2.postdate = t1.postdate
        and t2.actioncode = 'W'
        and t2.posttime < t1.posttime
)