Вычитать различные значения строки на основе другого значения столбца - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь сделать почти то же самое, что и этот вопрос , но я не могу сформулировать свою цель после того, как попытался изменить это в моем случае.

   id, type, time, amount
   ------------
   18, depo, 2020-02-02 10:13:00, 30
   17, full, 2020-02-02 10:12:00, 100
   16, full, 2020-02-01 15:12:00, 100
   15, full, 2020-02-01 13:12:00, 100

Все, что мне нужно, это SUM () для всей группы по дате, я сделал это.

SELECT sum(amount) amount, DATE(time) day 
  FROM `payment` 
 GROUP BY DATE(time), type 
 ORDER BY day, type DESC

Возвращает две одинаковые даты

   70, 2020-02-02
   100, 2020-02-02
   200, 2020-02-01

Мне нужна полная операция минус на (-) Депо, так что в 2020-02-02 я получу 70. То же самое с другими датами. Я думаю назначить все данные для PHP массивов, но есть ли «более простой» обходной путь, чтобы я мог просто вызывать данные прямо из запроса.

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

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы можете использовать условные (case..when предложение) в агрегации:

SELECT sum(case when type = 'depo' then - amount else amount end) amount, DATE(time) day 
  FROM `payment` 
 GROUP BY DATE(time), type 
 ORDER BY day, type DESC
0 голосов
/ 04 февраля 2020

Вы получаете две строки из-за предложения group by: group by type: одна строка для депо и одна строка для полного, если единственные строки, которые вам нужно агрегировать, это строки where type in ('full', 'depo'), тогда вы можете просто сгруппировать по Дата (мой ответ основан на ответе @ Barbaros-Özhan)

SELECT sum(case when type = 'depo' then - amount else amount end) amount, DATE(time) day 
  FROM `payment` 
  WHERE type IN ('full', 'depo')
 GROUP BY day 
 ORDER BY day

Я также удалил тип ORDER BY, так как вы сказали, что все, что вам нужно, это SUM by DATE.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...