避免重复行 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.DUEDAY
和 B.BILLDATE
列之一可以为空
或者两者都可以为空。
你能建议我怎样才能得到我想要的结果吗?
您不需要 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'
要看你的标准,不清楚。看起来您想使用 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');
您能否建议我如何避免以下情况的重复值。
我正在使用 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
列之一可以为空
或者两者都可以为空。
你能建议我怎样才能得到我想要的结果吗?
您不需要 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'
要看你的标准,不清楚。看起来您想使用 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');