Странный результат с MAX и COALESCE в запросе SQL при запуске разными пользователями - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть запрос SQL Server, который пытается выбрать NULL, если в столбце PredComplDate есть хотя бы один NULL или последняя дата хранится как NVARCHAR(30)

Странно то, чтокогда я запускаю запрос, он возвращает правильные результаты, но когда мой коллега выполняет запрос на том же компьютере, он возвращает разные результаты.

Я сохранил таблицу, созданную, когда мой коллега выполнил запрос под другимимя и сравнил его с тем, который был создан при запуске запроса.все одинаково, количество записей, тип данных и т. д., но по какой-то причине приведенная ниже часть запроса не возвращает NULL:

SELECT [Reference Number],
    CASE 
        WHEN LEN(Predecessors)>0 AND MAX(COALESCE(PredComplDate,'31/12/2099'))='31/12/2099' THEN NULL
        ELSE MAX(PredComplDate)
    END AS LatestPredComplDate
    FROM mytable33
    GROUP BY [Reference Number],Predecessors

В чем проблема с этим запросом?

mytable33 был создан мной, а mytable22 создан моим сотрудником.когда я запрашиваю результаты идентичны:

SELECT Predecessors,[Reference Number], PredRefNo,PredComplDate  FROM mytable22

SELECT Predecessors,[Reference Number], PredRefNo,PredComplDate  FROM mytable33

enter image description here

когда я запускаю вышеупомянутый запрос для обеих таблиц, результат отличается:

SELECT [Reference Number],
    CASE 
        WHEN LEN(Predecessors)>0 AND MAX(COALESCE(PredComplDate,'31/12/2099'))='31/12/2099' THEN NULL
        ELSE MAX(PredComplDate)
    END AS LatestPredComplDate
    FROM mytable22
    GROUP BY [Reference Number],Predecessors

SELECT [Reference Number],
    CASE 
        WHEN LEN(Predecessors)>0 AND MAX(COALESCE(PredComplDate,'31/12/2099'))='31/12/2099' THEN NULL
        ELSE MAX(PredComplDate)
    END AS LatestPredComplDate
    FROM mytable33
    GROUP BY [Reference Number],Predecessors

enter image description here

Ожидаемый результат NULL для LastestPredComplDate

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

В конце концов я обнаружил проблему. Формат даты (сохраненный как NVARCHAR) был виновником. Если вы посмотрите на первое изображение, которое я разместил, вы увидите, что одни и те же даты имеют разные форматы. Один - 04/12/2019, а другой - 4/12/2019. Оказывается, функция MAX будет считать 4/12/2019 больше 04/12/2019, и это приведет к другим результатам.

0 голосов
/ 23 апреля 2019

Возможно, вы можете поместить оба предложения в вашу оконную функцию, как показано ниже (если только для ясности):

  MAX(CASE WHEN LEN(Predecessors)>0 THEN NULL ELSE PredComplDate END) AS LatestPredComplDate
...