MS SQL无法在select中进行计算

时间:2015-01-30 15:55:36

标签: sql sql-server select

我希望找到一组付款记录,以便我可以将它们组合在一起。例如,对同一客户,账户等的付款,但是在1日和31日之后进行。

我有以下代码。它查找具有相同客户,协议等的记录,并找到要用作更新记录的最小值(AGRMT_PMNT_ID)。

问题在于行eap.PMNT_DAY - eap1.PMNT_DAY> 5不起作用。它总是返回0.如果我注释掉这一行,它会起作用,但会返回错误的结果。

似乎我可以比较选择中的列。 eap.a = eap1.a,但我不能做数学(eap.a - eap1.a> 5)

我做错了什么?

SELECT *
  FROM TMP_AGREEMENT_PAYMENTS  AS eap
  WHERE eap.AGRMT_PMNT_ID = 
     (
        SELECT min(eap1.AGRMT_PMNT_ID) AS expr
        FROM TMP_AGREEMENT_PAYMENTS  AS eap1
        WHERE 
           eap.CUSTOMER_ID = eap1.CUSTOMER_ID AND
           eap.AGREEMENT_ID = eap1.AGREEMENT_ID AND
           eap.TXN_CODE = eap1.TXN_CODE AND
           eap.TXN_CORR_ACCOUNT = eap1.TXN_CORR_ACCOUNT AND
           eap.PMNT_DAY - eap1.PMNT_DAY > 5 -- THIS LINE DOESN'T WORK
     )

以下是一些示例数据。

    AGRMT_PMNT_ID   442530  442531
    CUSTOMER_ID 382100000000000063131   382100000000000063131
    AGREEMENT_ID    38210000000010251257    38210000000010251257 
    PMNT_DAY    3   31
    PMNT_DAY1   34  0
    PMNT_AMOUNT 597.37  597.37

您可以看到AGRMT_PMNT_ID 442530和442531是针对同一客户,协议等的。在第3天和第31天支付了597.37的金额。目的是将这两个记录数据组合在一起。

问题是代码          eap.PMNT_DAY - eap1.PMNT_DAY> 5 检查记录442531中记录442530减去pmnt_day的pmnt_day是否超过5,即。他们相隔超过5天。

在选择中我可以比较来自不同记录的列,例如。          eap.CUSTOMER_ID = eap1.CUSTOMER_ID,

但我不能在计算中使用这些列          eap.PMNT_DAY - eap1.PMNT_DAY> 5

我认为这只是我的愚蠢,但我错过了什么?

更新

以下代码符合我的要求。感谢您的所有意见。

SELECT *
  FROM TMP_AGREEMENT_PAYMENTS  AS eap
  WHERE eap.AGRMT_PMNT_ID IN 
     (
        SELECT min(eap1.AGRMT_PMNT_ID) AS expr
        FROM TMP_AGREEMENT_PAYMENTS  AS eap1, 
             TMP_AGREEMENT_PAYMENTS  AS eap2
        WHERE 
           eap2.CUSTOMER_ID = eap1.CUSTOMER_ID AND
           eap2.AGREEMENT_ID = eap1.AGREEMENT_ID AND
           eap2.TXN_CODE = eap1.TXN_CODE AND
           eap2.TXN_CORR_ACCOUNT = eap1.TXN_CORR_ACCOUNT AND
           eap2.PMNT_DAY - eap1.PMNT_DAY > 5 
        GROUP BY eap1.CUSTOMER_ID, eap1.AGREEMENT_ID, 
                 eap1.TXN_CODE, eap1.TXN_CORR_ACCOUNT
 )

2 个答案:

答案 0 :(得分:0)

是的,评论上的SLin是对的。

DATEDIFF (day, eap1.PMNT_DAY, eap.PMNT_DAY) > 5

如果它只是整数,您可能想尝试在计算周围添加括号。

答案 1 :(得分:0)

此查询是否能满足您的需求?

SELECT * 
FROM TMP_AGREEMENT_PAYMENTS eap
INNER JOIN TMP_AGREEMENT_PAYMENTS eap1 ON eap.CUSTOMER_ID = eap1.CUSTOMER_ID
           AND eap.AGREEMENT_ID = eap1.AGREEMENT_ID 
           AND eap.TXN_CODE = eap1.TXN_CODE
           AND eap.TXN_CORR_ACCOUNT = eap1.TXN_CORR_ACCOUNT
           AND (eap.PMNT_DAY - eap1.PMNT_DAY) > 5