避免重复行 SQL 服务器

avoiding duplicate rows SQL Server

您能否建议我如何避免以下情况的重复值。

我正在使用 datediff 函数,我的第二个参数超过一行并导致错误。

SELECT COALESCE(DATEDIFF(DAY,'1987-01-19 00:00:00.000',( SELECT CASE WHEN  B.BILLDATE IS NULL THEN COALESCE(MIN(B.DUEDAY),0) ELSE COALESCE(MIN(B.BILLDATE),0) END BILL_DATE 
                                        FROM BILL B WHERE b.ORDERNR IN('2684667') GROUP BY BILLDATE)),0) res_col  

对于我的第二个参数,我得到了两个值。可能是因为我的子查询中的 group by 子句。

供您参考:B.DUEDAYB.BILLDATE 列之一可以为空
或者两者都可以为空。

你能建议我怎样才能得到我想要的结果吗?

您不需要 CASE 声明。你可以像这样直接使用COALESCEMIN(COALESCE(B.BILLDATE,B.DUEDAY),0)。您的查询应该是这样的。

SELECT COALESCE(DATEDIFF(DAY,'1987-01-19 00:00:00.000',
    (
        SELECT MIN(COALESCE(B.BILLDATE,B.DUEDAY,0)) 
        FROM BILL B
        WHERE B.ORDERNR = '2684667'
    )
),0) res_col

写这个 sql 的另一种更简单的方法是

SELECT DATEDIFF(DAY,'1987-01-19 00:00:00.000',MIN(COALESCE(B.BILLDATE,B.DUEDAY,0))) res_col
FROM BILL B
WHERE B.ORDERNR = '2684667'

要看你的标准,不清楚。看起来您想使用 BillDate 并且当它为 null 时使用到期日期,但不清楚何时进行 null 检查(因为您的尝试是两者的混合),例如

BillDate    DueDate
-------------------------
2015-04-01  NULL
NULL        2014-03-01
2015-04-30  2015-04-30

如果在聚合之前进行空值检查:

MIN(COALESCE(BillDate, DueDate)) --> 2015-03-01

你会得到一个不同的答案:

COALESCE(MIN(BillDate), MIN(DueDate)) --> 2015-04-01

尽管如此,答案非常相似,您也不需要子查询:

SELECT  Method1 = COALESCE(DATEDIFF(DAY,
                                '1987-01-19 00:00:00.000',
                                COALESCE(MIN(BillDate), MIN(DueDate))), 0),
        Method2 = COALESCE(DATEDIFF(DAY,
                                '1987-01-19 00:00:00.000',
                                COALESCE(MIN(BillDate), MIN(DueDate))), 0)
FROM    BILL AS b
WHERE   b.ORDERNR IN('2684667');