Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
e24
Member

Откуда:
Сообщений: 25
Есть 2-е таблицы связаны по полю DocID

Таблица Doc
Doc
DocID int pk autoinc
DocDate datetime
ParamID int


Таблица DocTab
DocTab
DocTabID int pk autoinc
DocID int fk
DocTabCount double
DocTabPrice double


Поле DocTabCount может принимать как положительные значение, так и отрицательные.
Вот мне надо получить сумму положительных и сумму отрицательных значений, например так:
SELECT 
  SUM(Plus .DocTabCount * Plus .DocTabPrice) AS SumPlus
  SUM(Minus.DocTabCount * Plus .DocTabPrice) AS SumMinus
FROM Doc
LEFT JOIN DocTab Plus ON Plus.DocID=Doc.DocID
LEFT JOIN DocTab Minus ON Plus.DocID=Doc.DocID
WHERE ...
2 окт 14, 10:31    [16648577]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
SIGN()
2 окт 14, 10:36    [16648613]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
e24
Member

Откуда:
Сообщений: 25
Пардон, запрос чуть исправлю:
SELECT 
  SUM(Plus .DocTabCount * Plus .DocTabPrice) AS SumPlus
  SUM(Minus.DocTabCount * Plus .DocTabPrice) AS SumMinus
FROM Doc
LEFT JOIN DocTab Plus ON Plus.DocID=Doc.DocID and Plus.DocTabCount>0
LEFT JOIN DocTab Minus ON Plus.DocID=Doc.DocID and Plus.DocTabCount<0
WHERE ...
2 окт 14, 10:40    [16648658]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
Добрый Э - Эх
Guest
e24,

case.
а в нем либо явно проверять число на больше/меньше нуля, либо анализировать знак посредством sign()
2 окт 14, 10:49    [16648735]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
e24
Member

Откуда:
Сообщений: 25
А сам запрос то как построить?
Если делаю по отдельности то работает на ура:
SELECT 
  SUM(Plus .DocTabCount * Plus .DocTabPrice) AS SumPlus
FROM Doc, DocTab Plus 
WHERE Plus.DocID=Doc.DocID and Plus.DocTabCount>0

and
SELECT 
  SUM(Minus.DocTabCount * Plus .DocTabPrice) AS SumMinus
FROM Doc, DocTab Minus
WHERE Plus.DocID=Doc.DocID and Plus.DocTabCount<0


А вот как одним запросом?
2 окт 14, 11:25    [16649044]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT 
  SUM(CASE WHEN Plus.DocTabCount>0 THEN Plus .DocTabCount * Plus .DocTabPrice ELSE 0 END) AS SumPlus
  SUM(CASE WHEN Plus.DocTabCount<0 THEN Plus .DocTabCount * Plus .DocTabPrice ELSE 0 END) AS SumMinus
FROM Doc, DocTab Plus 
WHERE Plus.DocID=Doc.DocID;
2 окт 14, 11:28    [16649069]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
iap,

не надо писать эти
ELSE 0
, они только процессор без толку грузят
2 окт 14, 13:32    [16650079]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
не надо писать эти
ELSE 0

, они только процессор без толку грузят

А еще не гененрируют предупреждения о пропущенных агрегатом NULL-ах
2 окт 14, 13:34    [16650098]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a_voronin
iap,

не надо писать эти
ELSE 0

, они только процессор без толку грузят
Надо, Федя, надо! ©

Про загрузку процессора - это сказки в данном случае.
2 окт 14, 13:39    [16650135]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory,

SET ANSI_WARNINGS OFF;

SELECT SUM(X) FROM 
( 
	SELECT 1 X
	UNION ALL
	SELECT NULL 
) T 


Надеюсь я не буду забанен за то, что оспорил истинность вашей рекомендации.
2 окт 14, 13:40    [16650140]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
iap
Надо, Федя, надо! ©

Про загрузку процессора - это сказки в данном случае.


Желающие могут ставить, я не ставлю. Спор ни о чём.
2 окт 14, 13:41    [16650148]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
Надеюсь я не буду забанен за то, что оспорил истинность вашей рекомендации.

Будете. Потому что не прочитали, на что еще подействует ваше SET ANSI_WARNINGS OFF
2 окт 14, 13:42    [16650154]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
что оспорил истинность вашей рекомендации.

Оспаривать рекомендации - это не тоже самое что комментировать "репертуар".
2 окт 14, 13:45    [16650171]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a_voronin
Glory,

SET ANSI_WARNINGS OFF;

SELECT SUM(X) FROM 
( 
	SELECT 1 X
	UNION ALL
	SELECT NULL 
) T 



Надеюсь я не буду забанен за то, что оспорил истинность вашей рекомендации.
Не всегда возможно применить SET ANSI_WARNINGS OFF;
В некоторых случаях сервер ТРЕБУЕТ, чтобы было ON.

Некоторые подробности здесь: http://msdn.microsoft.com/ru-ru/library/ms190368(v=sql.100).aspx

Кроме того, SET не выполнишь в функции или в представлении.
2 окт 14, 13:46    [16650180]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
e24
Member

Откуда:
Сообщений: 25
iap

Работает. Спасибо.
2 окт 14, 13:48    [16650198]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
a_voronin
они только процессор без толку грузят
Вы уж как-нибудь определитесь насчет оверхеда по CPU.
А то получается, что ваши представления для генерации чисел и календаря с рекурсивными CTE этот оверхед не создают, а банальный else в case ой как создает.
2 окт 14, 13:57    [16650300]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
invm
a_voronin
они только процессор без толку грузят
Вы уж как-нибудь определитесь насчет оверхеда по CPU.
А то получается, что ваши представления для генерации чисел и календаря с рекурсивными CTE этот оверхед не создают, а банальный else в case ой как создает.


А что тут определяться -- календарь этот используется в кубе и на его скан тратится 1 секунда при том, что общее время обновления составляет 1 час. Поэтому здесь я не парюсь. Зато удобно поменял что-то в одной вьюхе и готово. А если надо аггрегировать напрямую из таблиц. Тут расход CPU может иметь значение. Так что у меня нет абсолютов. DEPENDS
2 окт 14, 14:08    [16650377]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
invm
генерации чисел и календаря с рекурсивными CTE этот оверхед не создают.


Я не говорил, что не создают. И некоторое время назад его загнал в INMEMEORY таблицу, но в связи с возникшей для этого необходимостью использовать в других запросах.
2 окт 14, 14:10    [16650393]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
o-o
Guest
a_voronin,

"не похвастаюсь кубами/INMEMEORY -- день прожит напрасно"?
вас спросили, в циферках скажите, насколько overhead от наличия ELSE в CASE превысил overhead в ваших хваленых алгоритмах по генерации календаря рекурсией.
видели, как вопрошающий таблички со временем в ms приводит в спорах, где участвует?
иначе да, болтология голимая
и нефиг на правду обижаться (щас побежит трубить, как его "троллят")
2 окт 14, 14:26    [16650520]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
o-o
насколько overhead от наличия ELSE в CASE превысил overhead в ваших хваленых алгоритмах по генерации календаря рекурсией.


Какой Overhead дает поездка на поезда из А в Б по сравнению с поездкой на самолёте? Вопрос из той же оперы. Кому-то ценнее время, а кому-то деньги, а кому-то возможность взять больше багажа.
2 окт 14, 14:34    [16650586]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
Кому-то ценнее время, а кому-то деньги, а кому-то возможность взять больше багажа.

Цифры то будут предоставлены ?
2 окт 14, 14:36    [16650602]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
o-o
Guest
a_voronin,

ну-ну, продолжайте трубить, инструмент погромче возьмите только, а то многие вас уж и слушать-то перестали

К сообщению приложен файл. Размер - 2Kb
2 окт 14, 14:41    [16650641]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
a_voronin
календарь этот используется в кубе и на его скан тратится 1 секунда при том, что общее время обновления составляет 1 час. Поэтому здесь я не парюсь.
И зачем же тогда, зная об оверхеде, вы рекомендуете свой способ людям, решающим совершенно другие задачи?
a_voronin
А если надо аггрегировать напрямую из таблиц. Тут расход CPU может иметь значение.
Можете продемонстрировать сколько дополнительно CPU отожрет else в case, относительно общего времени выполнения?
2 окт 14, 14:50    [16650718]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вообще не понимаю, о чём спор.
Если ELSE не написан, то это не значит, что его нет.
Это значит, что всё равно есть ELSE NULL.
Читайте документацию.
2 окт 14, 14:52    [16650735]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: получить сумму положительных и сумму отрицательных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
invm
Можете продемонстрировать сколько дополнительно CPU отожрет else в case, относительно общего времени выполнения?


Могу, но не хочу. У меня тут боевых запросов для оптимизации хватает. Тем более сейчас CASE в NATIVE_COMPILATION не поддерживается.
2 окт 14, 14:53    [16650742]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить