2015-04-30 4 views
0

Не могли бы вы предложить, как я могу избежать дублирования значений для приведенного ниже сценария.избегая повторяющихся строк 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 может быть пустым
или оба из них также может быть пустым.

Не могли бы вы предложить, как я могу получить желаемый результат?

+0

любая причина, по которой вы хотите группировать «BILLDATE»? Вы также используете 'MIN (B.BILLDATE)' в своем подзапросе. – ughai

+0

Мне не нужен оператор group by, но мне пришлось использовать для коррекции синтаксиса. Я просто хочу, если billdate имеет значение null, а затем min (dueday) else min (billdate). – Mofizur

ответ

1

Это зависит от ваших критериев, которые не ясно. Похоже, вы хотите использовать BillDate и когда это нулевая дата использования, но непонятно, когда делать нулевую проверку (потому что ваша попытка представляет собой смесь обоих), например.

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'); 
+0

Основываясь на комментариях OP, он ищет 'MIN (COALESCE (BillDate, DueDate))'. Первоначально у меня создалось впечатление, что ему может понадобиться минимальное значение из обоих столбцов. – ughai

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' 
+0

На самом деле, я хочу, чтобы мой второй параметр был равен «if billdate null », а затем min (dueday) else min (billdate). ' – Mofizur

+0

У меня была ошибка' COEALESCE', проверьте обновленный ответ – ughai

Смежные вопросы