您能否建议我如何避免以下方案的重复值。
我正在使用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.DUEDAY
和B.BILLDATE
列之一可以为空
或者两者都可以为空。
你能否建议我如何得到我想要的结果?
答案 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');