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

Откуда:
Сообщений: 197
Добрый день! Есть такой запрос:
SELECT (((SELECT SUM(Kolichestvo) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')-
((SELECT SUM(Kolich_Brak) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')+
(SELECT COUNT(ZavNomer) FROM Nastroyka WHERE Naimenovanie='Панель приборная ПП-08' and Sborka='True')+
(SELECT SUM(Kolichestvo) FROM Spisanie_Dannie WHERE Naimenovan='Панель приборная ПП-08'))))

В принципе ничего сложного, но если какое-то из условий равно нулую (т.е. в таблице нет совпадений), то оно получает значение "NULL" и из-за этого все выражение становится "NULL"!
Как обойти? Приводить к строковой переменной?
23 сен 13, 13:49    [14872559]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69029
FOGOT-BAstA
Добрый день! Есть такой запрос:
SELECT (((SELECT SUM(Kolichestvo) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')-
((SELECT SUM(Kolich_Brak) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')+
(SELECT COUNT(ZavNomer) FROM Nastroyka WHERE Naimenovanie='Панель приборная ПП-08' and Sborka='True')+
(SELECT SUM(Kolichestvo) FROM Spisanie_Dannie WHERE Naimenovan='Панель приборная ПП-08'))))


В принципе ничего сложного, но если какое-то из условий равно нулую (т.е. в таблице нет совпадений), то оно получает значение "NULL" и из-за этого все выражение становится "NULL"!
Как обойти? Приводить к строковой переменной?

использовать
isnull
23 сен 13, 13:51    [14872575]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
SELECT (((SELECT SUM(ISNULL(Kolichestvo,0)) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')-
((SELECT SUM(ISNULL(Kolich_Brak,0)) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')+
(SELECT COUNT(ISNULL(ZavNomer,0)) FROM Nastroyka WHERE Naimenovanie='Панель приборная ПП-08' and Sborka='True')+
(SELECT SUM(ISNULL(Kolichestvo,0)) FROM Spisanie_Dannie WHERE Naimenovan='Панель приборная ПП-08'))))


Все так же итог NULL
23 сен 13, 14:18    [14872745]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Glory
Member

Откуда:
Сообщений: 104751
FOGOT-BAstA
Все так же итог NULL

Потому что не там ISNULL поставили
23 сен 13, 14:21    [14872774]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
hallabud
Member

Откуда: Киев
Сообщений: 245
FOGOT-BAstA,

COUNT в ISNULL не нужно заворачивать.
Заверните в ISNULL весь подзапрос
23 сен 13, 14:21    [14872775]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Кстати, есть большое подозрение, что вот это
(SELECT SUM(ISNULL(Kolichestvo,0)) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')-
((SELECT SUM(ISNULL(Kolich_Brak,0)) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5')

будет все равно что
SELECT SUM(ISNULL(Kolichestvo,0))-SUM(ISNULL(Kolich_Brak,0)) FROM VhKontrERI_Dannie WHERE ID_VhodKontrolERI='5'

А вообще, я бы все эти слагаемые через union all бы собрал бы в одно множество, а потом просуммировал - как то правильнее так будет, наверное.
23 сен 13, 14:57    [14873117]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
hallabud
FOGOT-BAstA,

COUNT в ISNULL не нужно заворачивать.
Заверните в ISNULL весь подзапрос


Чет не получается! В итоге он выдает просто 0, а должен конкретное число "13" выдавать...
Напишите где по-вашему правильно поставить isnull?
24 сен 13, 07:59    [14875611]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
isnull((select...),0)
24 сен 13, 08:11    [14875625]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Cygapb-007
isnull((select...),0)

Вник, спасибо!
24 сен 13, 08:19    [14875631]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Привет всем! Не буду создавать новую тему, напишу здесь!
Не получается сделать выборку из нескольких таблиц по двум одинаковым параметрам! Задача вроде даровская, но не могу допереть!

Вот такой запрос:

SELECT (SELECT Kartochka.Naimenovanie, Kartochka.ZavNomer, Kartochka.Date FROM Kartochka WHERE Kartochka.Naimenovanie='Пломба электронная' and Kartochka.ZavNomer='2'),
(SELECT Montazh.DateOkonch FROM Montazh WHERE Montazh.Naimenovanie='Пломба электронная' and Montazh.ZavNomer='2'),
(SELECT Nastroyka.Date_PSI FROM Nastroyka WHERE Nastroyka.Naimenovanie='Пломба электронная' and Nastroyka.ZavNomer='2'),
(SELECT Ypakovka.Date_Otpravka, Ypakovka.DateSklad FROM Ypakovka WHERE Ypakovka.Naimenovanie='Пломба электронная' and Ypakovka.ZavNomer='2'), 
(SELECT Remont.DatePostypl, Remont.DateOkonchRem FROM Remont WHERE Remont.Naimenovanie='Пломба электронная' and Remont.ZavNomer='2')


Просто в каждой таблице есть поле Naimenovanie и ZavNomer!

Пишет вот что:

Сообщение 116, уровень 16, состояние 1, строка 1
В списке выбора можно указать только одно выражение, если вложенный запрос не предварен EXISTS.
Сообщение 116, уровень 16, состояние 1, строка 4
В списке выбора можно указать только одно выражение, если вложенный запрос не предварен EXISTS.
Сообщение 116, уровень 16, состояние 1, строка 5
В списке выбора можно указать только одно выражение, если вложенный запрос не предварен EXISTS.


Что мои кривые руки должны исправить?
Заранее спасибо!
25 сен 13, 11:24    [14881294]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Glory
Member

Откуда:
Сообщений: 104751
FOGOT-BAstA
Что мои кривые руки должны исправить?

Вы пытаетесь в каждый столбец конечного запроса добавить набор из двух полей и неизвестного количества записей
25 сен 13, 11:28    [14881323]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Glory,
Я вроде как выбираю а не вставляю поля!
25 сен 13, 12:28    [14881686]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Glory
Member

Откуда:
Сообщений: 104751
FOGOT-BAstA
Я вроде как выбираю а не вставляю поля!

Что по-вашему делает первывй селект в вашем запросе ? А что делает 2ой, 3ий и тд ?
25 сен 13, 12:30    [14881698]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Glory
FOGOT-BAstA
Я вроде как выбираю а не вставляю поля!

Что по-вашему делает первывй селект в вашем запросе ? А что делает 2ой, 3ий и тд ?

Выбирает нужные столбцы по заданному условию...А Вы что подумали?
26 сен 13, 06:25    [14885476]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
FOGOT-BAstA
Выбирает нужные столбцы

Вот и именно!
Вы просите сервер запихнуть в одну ячейку, целую таблицу из 3-х столбцов и не известного числа строк. Увы и ах, сервер так не умеет. На что Glory Вам мягко намекает.
Изучите синтаксис T-SQL, в частности, что такое JOIN и счем его едят.
Для затравки, первые 2 строчки вашего селекта могу выглядеть примерно так
SELECT  K.Naimenovanie
      , K.ZavNomer
      , K.Date
      , M.DateOkonch
     FROM Kartochka K
          LEFT OUTER JOIN Montazh M ON M.Naimenovanie = K.Naimenovanie
                                   AND M.ZavNomer     = K.ZavNomer
     WHERE K.Naimenovanie = 'Пломба электронная'
       AND K.ZavNomer='2'
26 сен 13, 07:25    [14885522]     Ответить | Цитировать Сообщить модератору
 Re: Сложение и вычитание запросов!  [new]
Glory
Member

Откуда:
Сообщений: 104751
FOGOT-BAstA
Glory
пропущено...

Что по-вашему делает первывй селект в вашем запросе ? А что делает 2ой, 3ий и тд ?

Выбирает нужные столбцы по заданному условию...А Вы что подумали?

Т.е в первом столбце результата как то должна поместиться таблица
SELECT Kartochka.Naimenovanie, Kartochka.ZavNomer, Kartochka.Date
FROM Kartochka
WHERE Kartochka.Naimenovanie='Пломба электронная' and Kartochka.ZavNomer='2'
?
26 сен 13, 09:07    [14885727]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить