Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как посчитать итог по вычисляемому полю? (число прочтений - 6096 )
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Как посчитать итог по вычисляемому полю?
24. Декабря 2007 :: 11:27
Печать  
   |SELECT
  |ВложЗапрос.Товар [Товар $Справочник.Товары],
  |ВложЗапрос.Склад [Склад $Справочник.Склады],
  |Sum(ВложЗапрос.Количество) Количество,
  |Sum(ВложЗапрос.Резерв) Резерв,
  |Sum(ВложЗапрос.ВалСтоим) ВалСтоим,
  |
  |CASE WHEN Sum(ВложЗапрос.Количество)<>0 THEN
  |Sum(ВложЗапрос.ВалСтоим)/Sum(ВложЗапрос.Количество)*Sum(ВложЗапрос.Резерв)
  |ELSE Sum(ВложЗапрос.Прих_Цена)*Sum(ВложЗапрос.Резерв) END,    
             
  ....................
  |GROUPING(ВложЗапрос.РодТекст) as ИтПоСтаршРод,
  |GROUPING(ВложЗапрос.Родитель) ИтПоРод,
  |GROUPING(ВложЗапрос.Склад) ИтПоСкладу,
  |GROUPING(ВложЗапрос.Товар) ИтПоТовару
   ..............................
  |GROUP BY
  |ВложЗапрос.РодТекст, ВложЗапрос.Родитель, ВложЗапрос.Склад, ВложЗапрос.Товар WITH ROLLUP                                                    
  |ORDER BY
  |ВложЗапрос.РодТекст, ВложЗапрос.Родитель, ВложЗапрос.Склад, ВложЗапрос.Товар, ИтПоСтаршРод DESC, ИтПоРод DESC, ИтПоСкладу DESC, ИтПоТовару DESC
     |";

Привет всем!
В запросе формируется вычисляемое поле - считается как произведение резерва на среднюю цену товара.

Соотвественно выводятся итоги по группировкам.

Так по вычисляемому полю итог считается не как сумма по всем элементам этой группы, а как произведение общего резерва по группе на среднюю цену по группе.

НУ типа того:

1   2 | х
3   5 | у
--------------
4   7 | Итог

Надо считать х=1*2; у=3*5; Итог=2+15=17;

А сейчас считает Итог=4*7=28

Как правильно посчитать итог по стоимости резерва м моем коде?
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #1 - 24. Декабря 2007 :: 11:40
Печать  
тут наверно вместо Sum какой-то другой оператор нужен в конструкции When, но вот какой?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как посчитать итог по вычисляемому полю?
Ответ #2 - 24. Декабря 2007 :: 11:49
Печать  
А если Sum(CASE ... END)?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #3 - 26. Декабря 2007 :: 07:33
Печать  
не получается.

Если сделать так,

|Sum(CASE WHEN ВложЗапрос.Количество<>0 THEN
|ВложЗапрос.ВалСтоим/ВложЗапрос.Количество*ВложЗапрос.Резерв
END)

то, поскольку во вложенном запросе было объединение из двух регистров (остатки товаров и резервы), теперь почему-то для тех строк, где ВложЗапрос.ВалСтоим/ВложЗапрос.Количество>0 ВложЗапрос.Резерв оказывается=0

и наоборот, если резерв>0, то ВложЗапрос.ВалСтоим=0.

В итоге выводит нулевые итоги.

Лишь когда пишешь Sum(ВложЗапрос.Резерв), запрос сразу выдает результат объединения из двух регистров, если без Sum, то почему он вначале считает все произведение, и только потом объединяет. В итоге фигня какая-то вылазит...

Хотя так итоги суммирует правильно.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #4 - 26. Декабря 2007 :: 07:42
Печать  
и еще сопутствующий вопрос:

Почему так работает:

SELECT
Sum(ВложЗапрос.ВалСтоим) as ВалСтоим,
Sum(ВалСтоим) as _1

----------------------------------------

а так:

(CASE WHEN ВложЗапрос.Количество<>0 THEN 
ВложЗапрос.ВалСтоим END) as ВалСтоим,
Sum(ВалСтоим) as _1

ничего не выдает, вернее, белый экран висящий только вылазит....?

  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как посчитать итог по вычисляемому полю?
Ответ #5 - 26. Декабря 2007 :: 08:15
Печать  
case when ... then ... else <тут ничего не надо?> end
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как посчитать итог по вычисляемому полю?
Ответ #6 - 26. Декабря 2007 :: 08:18
Печать  
Обратил внимание что у тебя может быть деление на 0, сам недавно лоханулся - пропускались строки
Сделал так:

CASE WHEN ОстаткиТоваровОстатки.ОстатокТовараОстаток = 0 THEN 0 ELSE CASE WHEN $ВнПеремещениеСтроки.Количество = ОстаткиТоваровОстатки.ОстатокТовараОстаток THEN ОстаткиТоваровОстатки.СтоимостьПрихОстаток                  ELSE ROUND(ОстаткиТоваровОстатки.СтоимостьПрихОстаток            *$ВнПеремещениеСтроки.Количество/ОстаткиТоваровОстатки.ОстатокТовараОстаток, 2) END END AS СтоимостьПрих
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #7 - 26. Декабря 2007 :: 08:29
Печать  
Вернее сказать, тут:

(CASE WHEN ВложЗапрос.Количество<>0 THEN   ВложЗапрос.ВалСтоим ELSE 0 END) as ВалСтоим,
Sum(ВалСтоим) as _1

Пишет - invalid column name 'ВалСтоим'
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #8 - 26. Декабря 2007 :: 08:45
Печать  
Короче, суть проблемы можно так сформулировать:

При такой конструкции - Sum(CASE ... END) - правильно выводит итоги по группе, но неправильно - значения в самой группе (при объед из 2 регистров)

При такой - CASE Sum() THEN Sum()*Sum() ELSE 0 END - наоборот, значения внутри группы правильные, все объединяет как надо, а вот итоги не те.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #9 - 26. Декабря 2007 :: 08:47
Печать  
А так Sum(Sum()) вообще не работает
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #10 - 26. Декабря 2007 :: 09:13
Печать  
Идти более реально думаю по пути Sum(CASE ... END).

Вот какая штука выходит:

В результате объединения UNION-ом двух регистров в результируютую ТЗ уже выбрасываются строки с резервами и остатками, т.е. объединенные.

Но на этапе построения запроса если указать условие:

Sum(Case When ВложЗапрос.Резерв<>0 Then ВложЗапрос.ВалСтоим), то выводит нулевые вал стоимости.

Также при условии Sum(Case When ВложЗапрос.ВалСтоим<>0 Then ВложЗапрос.Резерв) выводит нулевые резервы,

т.е., на этом этапе данные еще не соединены - резервы в одних строках, а остатки со стоимостью в других.

Может, это можно как нибудь обойти?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #11 - 26. Декабря 2007 :: 09:17
Печать  
Сделай свой запрос как подзапрос .
Во внутреннем без grouping - все остальное также.

Во внешнем grouping и еще раз суммы, в т.ч. над вычисляемым полем.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #12 - 26. Декабря 2007 :: 09:27
Печать  
>Сделай свой запрос как подзапрос

- В смысле результирующий запрос, уже объединяющий два других, сделать еще раз как подзапрос?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #13 - 26. Декабря 2007 :: 09:37
Печать  
Neo писал(а) 26. Декабря 2007 :: 09:27:
>Сделай свой запрос как подзапрос

- В смысле результирующий запрос, уже объединяющий два других, сделать еще раз как подзапрос?


Ну да.
В итоге у тебя должно быть 2 вложенных подзапроса.

Наверно есть более эффективные и изящные решения - но это достаточно проверенное.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как посчитать итог по вычисляемому полю?
Ответ #14 - 26. Декабря 2007 :: 12:46
Печать  
О.К., спасибо большое, теперь все заработало как надо !
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать