Можно ли объединить запросы в один

424
04 февраля 2017, 08:50

Доброе время суток,
Можно ли объединить следующие запросы в один запрос?:

select SUM(PROFIT) as PROFIT 
from ARCHIVE 
where PROFIT > 0.0 and DATE_END_RATE between '13.01.2017' and '14.01.2017'

С запросом

select SUM(PROFIT) as LOSS 
from ARCHIVE 
where PROFIT < 0.0 and DATE_END_RATE between '13.01.2017' and '14.01.2017'

А также

select * 
from ARCHIVE 
where DATE_END_RATE between '13.01.2017' and '14.01.2017'

чтобы сразу вывести все записи таблицы ARCHIVE, и еще добавить в нее два поля "PROFIT" и "LOSS", в которых отобразить соответствующие положительные и отрицательные суммы?

Заранее спасибо

Answer 1

Объединить первые два несложно:

select SUM(CASE WHEN PROFIT > 0.0 THEN PROFIT END) as PROFIT 
,      SUM(CASE WHEN PROFIT < 0.0 THEN PROFIT END) as LOSS 
from ARCHIVE 
where DATE_END_RATE between '13.01.2017' and '14.01.2017'

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

Answer 2

Оконных функций, позволяющих на каждой строке получить сразу сумму нескольких строк в MySQL нет, поэтому приходится накапливать результаты в переменных и во внешнем запросе их выводить.

select *, @p as PROFIT, @l as LOST
  from (
   select *,
          @p:=@p+if(PROFIT>0,PROFIT,0),
          @l:=@l+if(PROFIT<0,PROFIT,0)
     from ARCHIVE, (select @p:=0,@l:=0) A
    where DATE_END_RATE between '13.01.2017' and '14.01.2017'
  ) X
READ ALSO
Фрагменты или списки

Фрагменты или списки

ПриветствуюСоздаю свое первое клиент-серверное приложение, поэтому хочу проконсультироваться с более опытными разработчиками

434
Отправка файла через JSON на Java

Отправка файла через JSON на Java

Пытаюсь в приложении на андроид закодировать фото в base64, чтобы отправить его на серверОднако результаты нулевые

445
Android. Добавить контакт во временную адресную книгу

Android. Добавить контакт во временную адресную книгу

Есть следующая задача: когда приходит звонок, он отображается в "Журнале вызовов" бывает ситуация, когда пользователю нужно временно сохранить...

408
Attempt to invoke virtual method on a null object reference

Attempt to invoke virtual method on a null object reference

Есть приложение, в нем через DialogFragment заносятся текстовые данные, база данных подключается так:

882