避免重复行SQL Server

时间:2015-04-30 11:42:15

标签: sql-server duplicate-removal datediff

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

我正在使用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列之一可以为空 或者两者都可以为空。

你能否建议我如何得到我想要的结果?

2 个答案:

答案 0 :(得分:1)

您不需要CASE声明。您可以像COALESCE一样直接使用MIN(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'

答案 1 :(得分:1)

这取决于您的标准,这一点尚不清楚。看起来你想要使用BillDate,当它为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');