Функция ISNULL в сочетании с командой TOP 1 - PullRequest
0 голосов
/ 12 марта 2020

В настоящее время я создаю статистический отчет c, используя jaspersoft iReport 5.6.0 и MS SQL Server v17, чтобы проверить работоспособность sql.

В этом отчете некоторые утверждения ( например, «ALBRabatt») являются частью вычислений, поэтому они умножаются, делятся и т. д.

Таким образом, результатом этого утверждения не может быть «NULL», поэтому я пытаюсь решить эту проблему с помощью ISNULL.

Но у меня проблема со следующим утверждением:

ISNULL  
(  
      (  
        select top 1 rabatt  
        from artikellieferant  
        left join artikel on artikel.artikel=artikellieferant.artikel  
        where artikel.artikel=artikellieferant.artikel   
        order by artikellieferant.gueltigvon asc  
    ),  
    0  
    ) AS ALBRabatt

Сообщение об ошибке:

Сообщение 156, Уровень 15, Состояние 1, Строка 7 Неверный синтаксис рядом ключевое слово 'order'.

Пожалуйста, помогите мне исправить это.

Ответы [ 3 ]

2 голосов
/ 12 марта 2020

Вы можете использовать ISNULL() внутри запроса:

select top 1 ISNULL(rabatt, 0)
from artikellieferant left join 
     artikel 
     on artikel.artikel=artikellieferant.artikel
where artikel.artikel = artikellieferant.artikel -- redundant where clause
order by artikellieferant.gueltigvon asc

Однако ваш синтаксис запроса выглядит корректно для меня.

Если предположить, что таблица artikel поступает из внешнего запроса, если это так, просто выполните корреляцию :

( SELECT TOP (1) ISNULL(art.rabatt, 0)
  FROM artikellieferant art
  WHERE art.artikel = artikel.artikel
) AS AS ALBRabatt

Если позиция таблицы неверна, просто поменяйте местами таблицу и настройте столбец соответственно.

1 голос
/ 12 марта 2020

Полагаю, в критической проблеме отсутствует ключевое слово SELECT. Незначительной проблемой является то, что предложение WHERE здесь просто повторяет действие условия соединения, плюс требование действительно найти совпадение, поэтому после переключения соединения с LEFT JOIN на INNER JOIN его можно удалить без изменения лога запроса c.

select 
  ISNULL  
  (  
    (  
      select top 1 rabatt  
      from artikellieferant  
      inner join artikel on artikel.artikel=artikellieferant.artikel  
      order by artikellieferant.gueltigvon asc  
    ),  
    0  
  ) AS ALBRabatt
0 голосов
/ 12 марта 2020
SELECT ISNULL  
(  
      (  
        select top 1 rabatt  
        from artikellieferant  
        left join artikel on artikel.artikel=artikellieferant.artikel  
        where artikel.artikel=artikellieferant.artikel   
        order by artikellieferant.gueltigvon asc  
    ),  
    0  
    ) AS ALBRabatt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...