SQL SSMS IF THEN 具有跨同一字段的多个条件

SQL SSMS IF THEN with multiple criteria across same field

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

这是我原来的,但它只是在 SSMS 中搅动而没有结果。本质上,我只需要返回所有 'C' 类型的记录,其中 'W' 类型的记录的邮寄时间小于 'C',但记录的帐号和邮寄日期相同. posttime、postdate、type 和 number 都是我的 table.

中的字段

SELECT *

来自交易

WHERE ACTIONCODE = 'C' AND POSTTIME >= POSTTIME AND ACTIONCODE = 'W'

如果我理解正确的话,你所描述的可以通过JOINS来完成。 想想 relational data setsSARGs.

虽然您还没有给我们一个 table 结构(这有很大帮助),但该解决方案可以帮助您朝着正确的方向前进。下面假设 FACT table of TRANSACTIONS,其中 carnality 本身就是 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

更新:我不小心忘记包含正确的列数。始终指定您将在 INNER JOIN 中使用的相同列(如果您不在意,则指定 *)。

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

这将是使用 exists:

的典型方法
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
)