Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ms sql сервер функция isnull  [new]
dmitrich_net
Member

Откуда:
Сообщений: 4
здравствуйте форумчане.

есть запрос
SELECT lekarstva.idlek, lekarstva.idvid,lekarstva.edizm,((SELECT  SUM (+isnull(SOSTAV_POSTUPL.KOLVO,0))FROM SOSTAV_POSTUPL, postuplenie
WHERE
postuplenie.datapostupl<='01.01.2001' AND
SOSTAV_POSTUPL.nomerdok=postuplenie.nomerdok AND
SOSTAV_POSTUPL.IDLEK=lekarstva.IDLEK
)-
  (SELECT SUM (isnull(sost_prodaja.kolvo,0)) FROM PRODAJA,sost_prodaja
WHERE
 prodaja.data<='01.01.2001' AND
 
prodaja.nomerdok=sost_prodaja.nomerdok AND
 
sost_prodaja.IDLEK=lekarstva.IDLEK
)) AS ostatok
FROM lekarstva, sost_prodaja,sostav_postupl


данный запрос сначала вибирает колличество лекарств по поступлению и находит их сумму. затем по расходу, потом отнимает приход от расхода. и он работает нормально. но только тогда когда есть что либо по данному лекарству в расходе. т.е. если например , лекарство1 поступило в клличестве 100 штук а продажи его не было, то запрос вернёт то что ostatok по данному лекрству null.

подскажите как это исправить. я пробовал пользоваться функцией isnull но ничеого не вышло
2 ноя 12, 19:02    [13416492]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37224
Читайте про outer join.
2 ноя 12, 19:04    [13416497]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
Добрый Э - Эх
Guest
dmitrich_net
я пробовал пользоваться функцией isnull но ничеого не вышло
ты его не туда ставил...
только сегодня обсуждали отличие "пустого значения в результирующем наборе данных" и "пустого набора данных"...
2 ноя 12, 20:08    [13416686]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
Добрый Э - Эх
Guest
dmitrich_net,

вот сравни два схожих запроса (всё отличие - в местоположении функции ISNULL):

with t as (select 1 num)
-- Как написано у тебя:
select ((select isnull(num, 1) from t where 1 = 0));


with t as (select 1 num)
-- Как можно написать, чтобы работало:
select isnull((select num from t where 1 = 0),1);
2 ноя 12, 20:12    [13416704]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
Добрый Э - Эх
Guest
Кстати, с учетом того, что у тебя аггрегирующий запрос без предложения GROUP BY, то можно и так написать:

with t as (select 1 num)
-- Вначале ищем агрегатную сумму, затем применяем к ней ISNULL:
select ((select isnull(sum(num), 1) from t where 1 = 0));
2 ноя 12, 20:16    [13416716]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
dmitrich_net
Member

Откуда:
Сообщений: 4
Добрый Э - Эх
dmitrich_net
ты его не туда ставил...


поставил его так
isnull(sum(sost_prodaja.kolvo),0)

Тот же эффект, либо я не верно понял
2 ноя 12, 20:20    [13416728]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
Добрый Э - Эх
Guest
dmitrich_net
поставил его так
isnull(sum(sost_prodaja.kolvo),0)

Тот же эффект, либо я не верно понял
Ну так ты же самый первый совет (от Гавриленко Сергей Алексеевич о OUTER JOIN), скорее всего, проигнорил
2 ноя 12, 20:25    [13416741]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
dmitrich_net
Member

Откуда:
Сообщений: 4
dmitrich_net,

(select isnull(sum(sost_prodaja.kolvo),1) from PRODAJA,sost_prodaja
where
 prodaja.data<='01.01.2001' and

prodaja.nomerdok=sost_prodaja.nomerdok and

sost_prodaja.IDLEK=lekarstva.IDLEK
and 1 = 0
))


вот та часть запроса где я изменил местоположение isnull
2 ноя 12, 20:27    [13416747]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
dmitrich_net
Member

Откуда:
Сообщений: 4
Добрый Э - Эх
dmitrich_net
поставил его так
isnull(sum(sost_prodaja.kolvo),0)

Тот же эффект, либо я не верно понял
Ну так ты же самый первый совет (от Гавриленко Сергей Алексеевич о OUTER JOIN), скорее всего, проигнорил


я с OUTER JOIN не сталкивался раньше, и плохо представдяю как с ним в данном случае работать:(
2 ноя 12, 20:29    [13416756]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
Добрый Э - Эх
Guest
Форма написания запроса у тебя похрамывает.
Перепиши запрос так, чтобы у тебя были derived table (вложенные запросы select from select) во фразе FROM, а не скалярные коррелированные подзапросы во фразе select.
3 ноя 12, 07:41    [13417710]     Ответить | Цитировать Сообщить модератору
 Re: ms sql сервер функция isnull  [new]
Добрый Э - Эх
Guest
SELECT lekarstva.idlek, lekarstva.idvid,lekarstva.edizm,
       ((
           SELECT  SUM (+isnull(SOSTAV_POSTUPL.KOLVO,0))
             FROM SOSTAV_POSTUPL, postuplenie
            WHERE postuplenie.datapostupl<='01.01.2001' 
              AND SOSTAV_POSTUPL.nomerdok=postuplenie.nomerdok 
              AND SOSTAV_POSTUPL.IDLEK=lekarstva.IDLEK
        ) -
       (
           SELECT SUM (isnull(sost_prodaja.kolvo,0)) 
             FROM PRODAJA,sost_prodaja
            WHERE prodaja.data<='01.01.2001'
              AND prodaja.nomerdok=sost_prodaja.nomerdok 
              AND sost_prodaja.IDLEK=lekarstva.IDLEK
        )
       ) AS ostatok
  FROM lekarstva, sost_prodaja,sostav_postupl
---- Где WHERE ???
Оба ISNULL-а перемести. Возможно, у тебя поступлений по заданным условиям не находится.
А вообще, удивляет использование декарта в основном запросе. Или ты при копи-пасте потерял секцию WHERE основного запроса?
3 ноя 12, 07:54    [13417713]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить