Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > уравнение !!


Автор: uranpro 22.5.2008, 17:41
у меня есть вьюшка View:
ID int,
Price int,
CurValue int

нужно найти sum(price) и отнять от него все значения CurValue, которые меньше нуля

т.е. примерно так : select sum(price) - (select curvalue from .. where curvalue < 0)
что-то типа этого, подскажите, что делать^

Автор: Magnifico 22.5.2008, 20:30
имеется ввиду отнять от сгруппированной суммы  по конкретному id  сумму отрицательных значений CurValue по модулю 
этого же id
Код

select id ,sum(price - abs(case when curvalue < 0 then curvalue else 0 end))
from myView
group by id

Автор: uranpro 23.5.2008, 10:00
спасибо, сейчас проверю)

Автор: Akina 23.5.2008, 10:23
a abs зачем? минус на минус...

Автор: uranpro 23.5.2008, 10:33
Код

select sum(price - abs(case when curvalue < 0 then curvalue else 0 end))
from myView


вот что мне нужно^^, все работает

так (- abs) идет же... а если так сделать

Код

select sum(price + (case when curvalue < 0 then curvalue else 0 end))
from myView


будет работать?))) сча посмотрим

Автор: Magnifico 23.5.2008, 10:39
ты конкретно говори что теб надо сделать:
отнять от суммы( прайс ) значения которые меньше нуля (то есть отрицательные) .Отрицательные По Модулю или Нет?
Если нет то это перация называется сложения положительного с отрицательным :  5 -  8 ,а отнять
это 5 - (-8)
и вообще пример приводи если на словах не получается объяснить

Автор: uranpro 23.5.2008, 11:21
да мне нужно найти сумму продаж по Price и учесть возвраты(они лежат в CurValue)
поле возврата считается правильным, если оно <0
пример столбца CurValue:
10230
15200
-300
230
56210
2350
-1300
...

у меня есть еще один вопрос, странный глюк в MS SQL Server:

>= '20.05.2008' AND <= '20.05.2008'

эта выборка даст 0 строк, а вот эта выборка:
>= '20.05.2008' AND < '21.05.2008'

даст правильное число строк, на число 20.05.2008 !
и еще не работает запрос, когда ставишь = 20.05.2008

в чем проблема ? и как избавится от нее программно

зы: я бы прибавлял к последней дате (+1), но если там будет 30-ое или 31-ое число, то (((

выборка по полю Date (DateTime)

Автор: Akina 23.5.2008, 11:34
Цитата(uranpro @  23.5.2008,  12:21 Найти цитируемый пост)
>= '20.05.2008' AND <= '20.05.2008'
эта выборка даст 0 строк

Она даст все строки, где '20.05.2008 00:00:00'. Ни больше ни меньше.

Цитата(uranpro @  23.5.2008,  12:21 Найти цитируемый пост)
в чем проблема ? 

Для даты-времени надо использовать соответствующие конструкции. 
Код

Where ... Between ... And ...

Цитата(uranpro @  23.5.2008,  12:21 Найти цитируемый пост)
я бы прибавлял к последней дате (+1), но если там будет 30-ое или 31-ое число, то (((

DateAdd()

Автор: Magnifico 23.5.2008, 11:38
'20.05.2008' при конвертации в дату это будет 20.05.2008 :00:00:000   12 часов ночи -начало суток
'21.05.2008'  --> 21.05.2008 :00:00:000  начало других суток   

>= '20.05.2008' AND < '21.05.2008' получаем диапазон сутки

>= '20.05.2008' AND <= '20.05.2008'  а тут диапазон ноль

и дату при передаче в sql server надо в формате строки 'yyyymmdd' (что бы избежать многих проблем)
http://www.sql.ru/faq/faq_topic.aspx?fid=109

Автор: uranpro 23.5.2008, 11:48
да, я уже исправил с DD.MM.YYYY на YYYY/MM/DD
спасибо за информацию, пойду проверять

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)