Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 27.09.2019
Сообщений: 31

Как проверить положительность или отрицательность суммы трёх чисел на сервере SQL Server ?

27.09.2019, 20:35. Показов 3601. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 2 запроса SELECT возвращающих числа и есть известное число:

SQL
1
SELECT  COUNT  FROM sklad  WHERE id_tovar = 34 ;
- даёт первое число А1

SQL
1
SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 ;
- даёт второе число А2

А3 = 4; - третье число известно.

надо проверить IF(A1-A2-A3)>=0 не меняя данных в таблицах.
Можно ли это сделать на сервере SQL Server?
И как если можно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2019, 20:35
Ответы с готовыми решениями:

Как проверить отрицательность двух чисел в операторе Switch?
Мне нужно проверить координаты мыши X и Y на отрицательность. Что-то по типу этого: switch(PosMos.x, PosMos.y) { case > 0,...

Проверить что сумма трех чисел из textbox-ов больше суммы других трех
Я вожу 3 числа (от 6 до 10) в textbox, другие textbox заполняются рандомом. Получается "игра с компьютером". Если сумма моих 3 чисел...

Выполнить хранимую функцию или процедуру на сервере MS Sql Server
Здравствуйте. Подскажите как можно реализовать выполнение хранимой функции MS Sql Server с параметрами в MS Access.

7
10 / 5 / 5
Регистрация: 26.04.2019
Сообщений: 26
27.09.2019, 22:30
Лучший ответ Сообщение было отмечено strong_1902 как решение

Решение

SQL
1
2
3
4
5
SELECT CASE WHEN 4 +
(SELECT COUNT FROM sklad WHERE id_tovar = 34) +
(SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 )
>=0
THEN 'positive' ELSE 'negative' END
1
1 / 1 / 0
Регистрация: 27.09.2019
Сообщений: 31
27.09.2019, 23:37  [ТС]
спасибо! Заработало! Только мне надо повторить эту проверку 3 раза для 3 х разных id_tovar,
и если хоть одна не пройдёт, то сразу выход по 'negative'
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
       private bool proverkaVvoda(DataTable dtZakaz)
        {
            bool result = true;
            /////////////
            string sql = "";
            foreach (DataRow r in dtZakaz.Rows)
            {
                //на складе - zakazano - s >=0
                //на складе
                string select1 = " ( SELECT count  FROM sklad  WHERE id_tovar = " + r["id"] + " ) ";
                //zakazano
                string select2 = " ( SELECT SUM( count ) FROM zakaz WHERE id_tovar = " + r["id"]
                    + " AND vidan = 'False' ) "; 
                // v etom zakaze
                string s = r["количество"].ToString();
                helper.convertStrToDoubleSQL(ref s);
                //////////////
                /*
                SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 34) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 )
                - 4
                >=0
                THEN 'positive' ELSE 'negative' END
                */
                sql += " SELECT CASE WHEN " + select1 + " - " + select2 + 
                 " - " + s + " >= 0 THEN 'yes' ELSE 'no' END ";
            }
            f.sSQL.select(sql);
            DataRow rr = sSQL.ds.Tables[0].Rows[0];
            if (rr[0].ToString() == "no" ) result = false;
            /////////////////
            return result; ;
получается что-то типа
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
         
 
                 SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 34) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 )
                - 4
                >=0
                THEN 'positive' ELSE 'negative' END 
                 SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 35) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 35 )
                - 8
                >=0
                THEN 'positive' ELSE 'negative' END 
                 SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 29) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 29 )
                - 2
                >=0
                THEN 'positive' ELSE 'negative' END
а надо, чтобы у меня была возможность получить или сразу все 'negative', или хотя бы первый 'negative' или просто узнать, был ли хоть один 'negative' в результатах.

Добавлено через 25 минут
Я могу убрать лишние END, но как определить первый или количество 'negative' ?
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
                SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 34) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 )
                - 4
                >=0
                THEN 'positive' ELSE 'negative' 
 
                 SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 35) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 35 )
                - 8
                >=0
                THEN 'positive' ELSE 'negative' 
 
                 SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 29) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 29 )
                - 2
                >=0
                THEN 'positive' ELSE 'negative' END
Добавлено через 5 минут
И Всё это надо выполнить одним, а не тремя запросами на SQL сервере.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
28.09.2019, 00:32
T-SQL
1
2
3
4
5
6
7
8
select
 t.id_tovar, case when s.count - sum(z.count) - t.number >= 0 then 'positive' else 'negative' end
from
 (values (34, 4), (35, 8), (29, 2))) t(id_tovar, number) join
 sklad s on s.id_tovar = t.id_tovar join
 zakaz z on z.id_tovar = t.id_tovar
group by
 t.id_tovar, t.number, s.[count];
0
1 / 1 / 0
Регистрация: 27.09.2019
Сообщений: 31
28.09.2019, 09:17  [ТС]
Это тоже интересный совет.
Но я бы предпочёл увидеть что-то типа
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
                DECLARE @var CHAR(10) = (
                SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 34) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 )
                - 4 )
                >=0
                THEN 'positive' ELSE ( 'negative' RETURN) 
                @var  = (
                SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 35) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 35 )
                - 6 )
                >=0
                THEN 'positive' ELSE ( 'negative' RETURN)  
                @var  = (
                SELECT CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 36) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 36 )
                - 3 )
                >=0
                THEN 'positive' ELSE ( 'negative' RETURN) END
не уверен, что это сработает, но для моих задач надо бы что-то типа подпрограммы на SQL вместо одного оператора SELECT.

Добавлено через 12 минут
Так и есть. Не сработало.
Пишет: "неправильный синтаксис возле ключевого слова RETURN."

Добавлено через 1 час 55 минут
Кстати, SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 возвращает NULL, а не 0
В результате появляется неправильный результат. Как заставить его вернуть 0 вместо NULL ?
0
10 / 5 / 5
Регистрация: 26.04.2019
Сообщений: 26
28.09.2019, 09:38
Лучший ответ Сообщение было отмечено strong_1902 как решение

Решение

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 SELECT CASE WHEN
        CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 34) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 )
                - 4
                >=0
                THEN 0 ELSE 1 END 
                +
         CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 35) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 35 )
                - 8
                >=0
                THEN 0 ELSE 1 END
 +
         CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 29) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 29 )
                - 2
                >=0
                THEN 0 ELSE 1 END
>0 THEN 'negative' ELSE 'positive' END
Добавлено через 7 минут
Заменить SELECT SUM( COUNT ) => SELECT coalesce(SUM( COUNT ) ,0)
1
1 / 1 / 0
Регистрация: 27.09.2019
Сообщений: 31
28.09.2019, 11:10  [ТС]
Цитата Сообщение от msi77 Посмотреть сообщение
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 SELECT CASE WHEN
        CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 34) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 34 )
                - 4
                >=0
                THEN 0 ELSE 1 END 
                +
         CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 35) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 35 )
                - 8
                >=0
                THEN 0 ELSE 1 END
 +
         CASE WHEN 
                (SELECT COUNT FROM sklad WHERE id_tovar = 29) -
                (SELECT SUM( COUNT ) FROM zakaz WHERE id_tovar = 29 )
                - 2
                >=0
                THEN 0 ELSE 1 END
>0 THEN 'negative' ELSE 'positive' END
Добавлено через 7 минут
Заменить SELECT SUM( COUNT ) => SELECT coalesce(SUM( COUNT ) ,0)
Спасибо! Вы мне очень помогли.

Добавлено через 44 минуты
Я сделал так и получаю 3 таблицы. Этот вариант хуже чем у Вас, но для новичка в процедурах сервера так полезнее для исходников и даёт больше вариантов применения впоследствии.

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 DECLARE @var1 float, @var2 float, @var3 float, @var4 float,  @var5 float ; 
        SET @var1 = (  ( SELECT count  FROM sklad  WHERE id_tovar = 5008 )  ) ; 
        SET @var2 = (  ( SELECT coalesce(SUM( COUNT ) ,0) FROM zakaz WHERE id_tovar = 5008 AND vidan = 'FALSE' )  ) ; 
        SET @var3 = '181' ; 
        SET @var4 = (SELECT @var1 - @var2 - @var3) ;
    SELECT CASE WHEN  @var4>=0 THEN 'yes' ELSE 'no' END ; 
 
    SET @var1 = (  ( SELECT count  FROM sklad  WHERE id_tovar = 5009 )  ) ;  
    SET @var2 = (  ( SELECT coalesce(SUM( COUNT ) ,0) FROM zakaz WHERE id_tovar = 5009 AND vidan = 'FALSE' )  ) ;  
    SET @var3 = '192' ;  
        SET @var4 = (SELECT @var1 - @var2 - @var3) ;  
    SELECT CASE WHEN  @var4>=0 THEN 'yes' ELSE 'no' END ;  
 
    SET @var1 = (  ( SELECT count  FROM sklad  WHERE id_tovar = 5010 )  ) ;  
    SET @var2 = (  ( SELECT coalesce(SUM( COUNT ) ,0) FROM zakaz WHERE id_tovar = 5010 AND vidan = 'FALSE' )  ) ;  
    SET @var3 = '194' ;  
        SET @var4 = (SELECT @var1 - @var2 - @var3) ;  
    SELECT CASE WHEN  @var4>=0 THEN 'yes' ELSE 'no' END ;
0
5962 / 4538 / 1094
Регистрация: 29.08.2013
Сообщений: 28,148
Записей в блоге: 3
28.09.2019, 14:59
Цитата Сообщение от strong_1902 Посмотреть сообщение
Я сделал так и получаю 3 таблицы
сделайте через Union

Добавлено через 1 минуту
4я переменная не нужна, да и вообще переменные не нужны

оформить вес это в процедуру и использовать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2019, 14:59
Помогаю со студенческими работами здесь

Как проверить значение на нечётность и отрицательность?
Как проверить значение на нечётность и отрицательность? if((i>0)&&(i%(-2)==0)) return Invalid; else ...

Нахождение среднего арифметического трех целых чисел или суммы двух вещественных
#include <iostream> #include <cmath> int main() { float x,y; int a,b,c; std::cout << "Input x,y В общем...

Нахождение среднего арифметического трех целых чисел или суммы двух вещественных
#include <stdio.h> #include <conio.h> int dd(int a,int b,int c) { int m; m=(a+b+c)/3; return m; } float dd(float x,float y)...

определить минимальный элемент из трех чисел и проверить явл. оно четным или нечетным
определить минимальный элемент из трех чисел и проверить явл. оно четным или нечетным


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru