Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.10.2010, 10:51
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
Вопрос В чем ошибка?

Всем здраствуйте, с талкнулся с такой проблемой пишу запрос:
Код:
  DM.ARH.Active:=false;
  DM.ARH.SQL.Clear;
  DM.ARH.SQL.Add('select sum(case when (sklad.flag=''0'') then sklad.kol else 0 end)- sum(case when(sklad.flag=''2'') then sklad.kol else 0 end), name');
  DM.ARH.SQL.Add('sum(case when (sklad.flag=''0'') then sklad.summa else 0 end)- sum(case when(sklad.flag=''2'') then sklad.summa else 0 end),shet,price');
  DM.ARH.SQL.Add('from sklad ');
  DM.ARH.SQL.Add('WHERE DATEBAY  <= :D');
  DM.ARH.SQL.Add('and KOL >0');
  DM.ARH.SQL.Add('group by NAME, shet, price');
  DM.ARH.Parameters.ParamValues['D'] := formatdatetime('yyyy.mm.dd', (datetimepicker1.Date));
  DM.ARH.Active:=true;

Но почемуто в результат попадают значения меньшие нуля и сам ноль, в чем ошибка подскажите?
Ответить с цитированием
  #2  
Старый 25.10.2010, 11:51
Vocabulary Vocabulary вне форума
Новичок
 
Регистрация: 17.09.2009
Сообщения: 85
Репутация: 9
По умолчанию

Если агрегатные функции возвращают sum(0) - sum(0), то результат этого выражения = 0.
Если функции в вычитании возвращают, например, sum(0) - sum(2), то результат = -2.
Ответить с цитированием
  #3  
Старый 27.10.2010, 16:53
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

что бы не было нулей добавляю условие
Код:
DM.ARH.SQL.Add('and KOL >0');
всеровно минусовые и нулевые есть как сделать чтобы после арифм опер. не выводились 0 или отрицательные числа....
Ответить с цитированием
  #4  
Старый 27.10.2010, 17:42
Vocabulary Vocabulary вне форума
Новичок
 
Регистрация: 17.09.2009
Сообщения: 85
Репутация: 9
По умолчанию

Условие KOL > 0 здесь ни при чем. Сервер сначала выбирает все записи с положительными значениями KOL, но потом в вычислении выражений запрос может вернуть и отрицательные и нулевые значения, согласно вышеприведенному примеру (sum(0) - sum(2)).
Смотрю на этот запрос и не понимаю почему "не нравятся" нулевые и отриц. значения. На складе могут быть и нулевые и отрицательные остатки.
Кстати, в запросе синтаксическая ошибка. И как он у вас с ней работает?

Абсолютно непонятно почему в запросе попытка вывести значения поля name (price, shet). Какой такой name в обобщающем запросе (где есть агрегатные функции, которые собирают данные из многочисленных строк, и из какой строки тогда этот name будет браться)?
Тут надо наверное посмотреть в документации как такие запросы делаются вообще, теорию так сказать.
Ответить с цитированием
  #5  
Старый 27.10.2010, 18:33
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Нормально работает, тогда подскажите как убрать нулевые и отрецательные остатки из результата?
Ответить с цитированием
  #6  
Старый 27.10.2010, 18:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну оберните кейсом результат суммирования, но без поллитры в таком запросе будет сложно разобраться
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 27.10.2010, 18:45
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ну оберните кейсом результат суммирования, но без поллитры в таком запросе будет сложно разобраться

Так стоп а подробней мона примерчик небольшой хотябы, плиззззззззз.....
Ответить с цитированием
  #8  
Старый 27.10.2010, 18:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Почему-бы вам не написать нормальную хранимку, где последовательно выполнить ряд запросов и уже результат вернуть в виде таблицы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 27.10.2010, 18:53
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Почему-бы вам не написать нормальную хранимку, где последовательно выполнить ряд запросов и уже результат вернуть в виде таблицы.
Понимете я с SQL не дружу, это мой первый запрос, как таковой (не считая select * from table) поэтому прошу пример как это должно выглядеть
Ответить с цитированием
  #10  
Старый 27.10.2010, 19:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну хорошо, попробую. Раз выводить надо только положительные результаты, то можно попробовать дописать условие отбора:
Код:
select sum(case when (sklad.flag=''0'') then sklad.kol else 0 end)- sum(case when(sklad.flag=''2'') then sklad.kol else 0 end), name, sum(case when (sklad.flag=''0'') then sklad.summa else 0 end)- sum(case when(sklad.flag=''2'') then sklad.summa else 0 end),shet,price 
from sklad
WHERE (DATEBAY <= :D) and (KOL > 0) and (sum(case when (sklad.flag=''0'') then sklad.kol else 0 end)- sum(case when(sklad.flag=''2'') then sklad.kol else 0 end) > 0) and (sum(case when (sklad.flag=''0'') then sklad.summa else 0 end)- sum(case when(sklad.flag=''2'') then sklad.summa else 0 end) > 0)
group by NAME, shet, price
Вот такое чудовище родилось. Попробуйте.
ПС: Непонятно, почему у вас запрос проходит без ошибок, ведь после name должна стоять запятая, а ее нет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 28.10.2010, 10:41
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Страдалец, спасибо ты настоящий мозг
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025